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

how do I set up my window function properly? (PostgreSQL)

我想获取种植特定作物的第一个条目(基准,crop_type)。我想从中提取信息的列表已经按年和月排序,但我不知道如何正确设置 window 函数。我认为最简单的方法是从每个收获(yield_fm 为 != 0)返回,作物类型为 != 999999,但正如我所说,不知道如何做到这一点。

来自我的 table 的片段:

"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

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

如果你想要每种裁剪类型的第一行,那么在 Postgres 中,我建议 distinct on:

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

distinct on 是 Postgres 扩展。 returns distinct on 子句中的每个组合占一行——在这种情况下,每个 crop_type.

返回的行是第一个遇到的行,基于 order by 子句。 order by 中的第一列应与 distinct on 中的列匹配。其余列然后定义 "first".