2017-06-28 164 views
1

我正在Greenplum DB中工作。Greenplum中的First_value窗口函数

First_value窗口函数得到奇怪的结果,当按顺序传递字符串值在所有行中都是通用的,那么它总是返回第一次插入的行,但理想情况下它应该返回任何值。下面是我的代码...

create temporary table test_first_value (id int,statename 
varchar(50),episodeid int, 
episodedate date) distributed by (id); 

insert into test_first_value values(12,'MP',9863,'2015-11-06'); 
insert into test_first_value values(12,'MP',98123,'2009-11-06'); 
insert into test_first_value values(12,'MP',90123,'2017-03-06'); 
insert into test_first_value values(12,'MP',44567,'2013-03-17'); 
insert into test_first_value values(13,'MP',189300,'2013-03-17'); 
insert into test_first_value values(13,'MP',443467,'2016-03-19'); 

它总是返回其第一插入相同的值,该值是episodeid = 9863对ID = 12和episodeid = 189300为ID = 13

Select *, 
First_value(episodeid) over(partition by id order by statename) as 
first_episodeid, 
First_value(episodedate) over(partition by id order by statename) as 
first_episodedate 
from 
test_first_value; 

enter image description here

现在,如果我改变我的插入顺序则总是返回这是第一次插入的行值是episodeid = 98123的ID = 12和episodeid = 443467为ID = 13

delete from test_first_value; 

insert into test_first_value values(12,'MP',98123,'2009-11-06'); 
insert into test_first_value values(12,'MP',90123,'2017-03-06'); 
insert into test_first_value values(12,'MP',44567,'2013-03-17'); 
insert into test_first_value values(12,'MP',9863,'2015-11-06'); 
insert into test_first_value values(13,'MP',443467,'2016-03-19'); 
insert into test_first_value values(13,'MP',189300,'2013-03-17'); 

Select *, 
First_value(episodeid) over(partition by id order by statename) as 
first_episodeid, 
First_value(episodedate) over(partition by id order by statename) as 
first_episodedate 
from 
test_first_value; 

enter image description here

请帮助我,我做错了。

+0

编辑你的问题,并显示“奇怪的结果”。你也应该解释你希望得到的结果。 –

+0

我认为你可能需要'按ID分区,按字母顺序排列状态名称' –

+0

@Pra你只能按顺序使用状态名。所以你不能预测你在这种情况下会有什么。 –

回答

0

您的代码正常工作。这是你的窗口函数:

First_value(episodeid) over(partition by id order by statename) 

正如你显示的数据,你有一个id具有相同statename多行。在这种情况下,数据库将从匹配键中返回一个任意且不确定的值。

另一种说法是,关系数据库中的排序不稳定。原因很简单:表格代表无序集合。如果排序键都是相同的,那么就没有自然的顺序来代替。

因此,找到另一个密钥,以便order by唯一标识每一行。这意味着结果将保持稳定,因为所需的行将被唯一标识。在您的数据中,您可以添加episode_date作为order by的第二个键。