Greenplum中的First_value窗口函数
Posted
技术标签:
【中文标题】Greenplum中的First_value窗口函数【英文标题】:First_value window function in Greenplum 【发布时间】:2017-06-28 12:22:32 【问题描述】:我在 Greenplum DB 工作。
在 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;
现在,如果我更改插入顺序,那么它将始终返回首先插入的行值,即 episodeid = 98123 for id = 12 和 episodeid = 443467 for 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;
请帮助我,我做错了什么。
【问题讨论】:
编辑您的问题并显示“奇怪的结果”。您还应该说明您想要获得什么结果。 我想你可能需要partition by id,statename order by episodedate
@Pra 你只使用 statename 来排序。所以你无法预测在这种情况下你会得到什么。
@Gordon Linoff 已添加结果。
【参考方案1】:
您的代码运行良好。这是你的窗口函数:
First_value(episodeid) over(partition by id order by statename)
正如您自己在数据中显示的那样,id
有多个行与相同的statename
。在这种情况下,数据库将从匹配的键中返回一个任意且不确定的值。
另一种说法是排序在关系数据库中是不稳定的。原因很简单:表格代表 无序 集。如果排序键都相同,那么就没有可以使用的自然顺序。
因此,找到另一个键,以便 order by
唯一标识每一行。这意味着结果将是稳定的,因为所需的行将被唯一标识。在您的数据中,您可以将episode_date
作为第二个键添加到order by
。
【讨论】:
以上是关于Greenplum中的First_value窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
Spark with HiveContext - AnalysisException:无法解析窗口函数“first_value”
Apache spark - 窗口函数,FIRST_VALUE 不起作用
窗口分析函数19_Mysql查询窗口函数里第一个最后一个第N个元素的值值案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)