如何正确设置窗口功能? (PostgreSQL)

时间:2019-05-29 11:43:19

标签: sql postgresql window-functions

我想获取种植特定作物的第一个条目(基准,crop_type)。我要从中提取信息的列表已经按年和月排序了,但是我不知道如何正确设置窗口功能。我认为最简单的方法是从各自的收获中退回(yield_fm为!= 0),农作物类型为!= 999999,但是正如我所说的,我不知道该怎么做。

我表中的代码段

"datum","crop_type","yield_fm"
1996-01-01,3,0
1996-02-01,3,0
1996-03-01,3,0
1996-04-01,3,0
1996-05-01,3,0
1996-06-01,3,0
1996-07-01,3,0
1996-08-01,3,9.5
1996-09-01,999999,0
1996-10-01,999999,0
1996-11-01,999999,0
1996-12-01,999999,0
1997-01-01,999999,0
1997-02-01,999999,0
1997-03-01,999999,0
1997-04-01,16,0
1997-05-01,16,0
1997-06-01,16,0
1997-07-01,16,0
1997-08-01,16,0
1997-09-01,16,53.7
1997-10-01,999999,0
1997-11-01,3,0
1997-12-01,3,0
1998-01-01,3,0
1998-02-01,3,0
1998-03-01,3,0
1998-04-01,3,0
1998-05-01,3,0
1998-06-01,3,0
1998-07-01,3,0
1998-08-01,3,8
1998-09-01,999999,0
1998-10-01,3,0
1998-11-01,3,0
1998-12-01,3,0
1999-01-01,3,0
1999-02-01,3,0
1999-03-01,3,0
1999-04-01,3,0
1999-05-01,3,0
1999-06-01,3,0
1999-07-01,3,0
1999-08-01,3,8

1 个答案:

答案 0 :(得分:1)

SQL表表示无序集。除非列指定顺序,否则没有顺序。

如果您想要每种作物类型的第一行,那么在Postgres中,我建议使用distinct on

select distinct on (crop_type) t.*
from t
order by crop_type, datum;

distinct on是Postgres扩展名。对于distinct on子句中的每个组合,它返回一行-在这种情况下,每个crop_type中的一行。

返回的行是遇到的第一个行,基于order by子句。 order by中的第一列应与distinct on中的列匹配。其余的列将定义“第一”。