我正在使用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
我怎样才能做到这一点?
如果你想要每个id一行,请使用distinct on
:
select distint on (id) t.*
from t
order by id, year desc;
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可能需要一个单独的子句?
这仅考虑2030年或任何一年<2019年。至少问题就是这样。 (我怀疑那里有些模糊。)
每个id
选择一排,最新一年排在第一位。
SELECT DISTINCT ON (id) *
FROM tbl
ORDER BY id, year DESC
WHERE (year = 2030 OR year < 2019);
如果有多个行具有相同的(id, year)
,则需要一个决胜局。
关于DISTINCT ON
的这个和更多细节: