带有特定条件的SQL查询的每个ID仅获得一行

时间:2019-02-27 22:52:10

标签: sql postgresql greatest-n-per-group

我正在使用Postgres v> 9。

我想获取这样的表的值:

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3
6   2015   0.4
6   2017   0.3

这个想法是获得年数<2019或year = 2030的行。如果重复id,我只想获得2030行,而不是2015年,也就是说,我要寻找的结果是:

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3

我该怎么做?

3 个答案:

答案 0 :(得分:0)

如果您希望每个ID一行,请使用%d

distinct on

答案 1 :(得分:0)

 SELECT ID,
        FIRST_VALUE(YEAR) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS year,
        FIRST_VALUE(Value) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS value  
 FROM t 
 WHERE YEAR = 2030 OR YEAR < 2019

我认为这是first_value的标准-postgre可能需要单独的子句吗?

答案 2 :(得分:0)

这仅考虑2030年或<2019年的任何一年。至少这就是问题所在。 (我怀疑那里有些模糊。)

它从id中选择一行,并以最近的年份为准。

SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, year DESC
WHERE (year = 2030 OR year < 2019);

如果可以有多行具有相同的(id, year),则需要一个决胜局。
关于此以及DISTINCT ON的更多详细信息: