首页 > 解决方案 > 简化 CTE 以获得不同年份的价值

问题描述

也许有人知道是否可以简化我的问题。我必须从不同年份 - 2015- 2016 - 2017 - 2018 中获取一个值。对于每一年都有不同的值(都在同一个表(MY_TABLE)中,例如:

DATE            VALUE
2015-01-12        K
2015-04-28        A
2015-07-11        M

我需要获取每年的最后一个值(在本例中为“M”)。

我的解决方案有效,我只是想知道是否有更清洁和更短的解决方案。

WITH CTE15 AS(
      SELECT a.*, row_number() OVER(partition by ID order by DATE desc) AS VALUE15
      FROM MY_TABLE
      WHERE DATE < date('2015-12-31')
     ),
     CTE16 AS (
      SELECT b.*, row_number() OVER(partition by ID order by DATE desc) as VALUE16
      FROM MY_TABLE
      WHERE DATE < date('2016-12-31')
      --and so for 2017 and 2018
     )
SELECT VALUE,*
FROM CTE15...INNER JOIN
     SOME TABLE
     ON KEY INNER JOIN CTE15
     ON KEY
WHERE CTE15.VALUE15 = 1 AND
      CTE16.VALUE16 = 1

另一个问题:

DATE            VALUE
2015-01-12        K
2015-04-28        A
2015-07-11        M
2015-09-18        U

如果最后一个值为'U',如何忽略'U'并跳转到值'M'?

标签: sqlpostgresql

解决方案


使用distinct on

select distinct on (date_trunc('year', date)) t.*
from my_table t
order by date;

如果您想要第n 个值,请使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by date_trunc('year', date) order by date desc) as seqnum
      from my_table t
     ) t
where seqnum = <n>;

推荐阅读