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)

oracle first_value,last_valus

带窗口的自定义Greenplum聚合函数

将 FIRST_VALUE 与基于另一列的条件一起使用