从具有特定条件的SQL查询中获取每个ID一行

问题描述 投票:0回答:3

我正在使用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年或年= 2030年的行。如果id重复,我想只获得2030行,而不是2015年,也就是说,我要找的结果是:

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

我怎样才能做到这一点?

sql postgresql greatest-n-per-group
3个回答
0
投票

如果你想要每个id一行,请使用distinct on

select distint on (id) t.*
from t
order by id, year desc;

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的标准 - postgres可能需要一个单独的子句?


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的这个和更多细节:

© www.soinside.com 2019 - 2024. All rights reserved.