sql - 简化 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'?
解决方案
使用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>;
推荐阅读
- c# - WPF 在没有 MVVM 的情况下在 UserlControl 中看到设计时绑定
- laravel - Laravel 5.8 验证电子邮件模块未在 Cpanel 上发送 EMAIL(共享主机)
- laravel - Laravel 验证在请假请求中失败
- javascript - 激活悬停时弹出窗口并单击任意位置关闭
- java - 耳朵依赖概况
- powerbi - 添加另一列时名称分解的计数或 ID
- javascript - 有哪些用于 AP Comp 的 JavaScript 抽象的好例子。科学。原则?
- sql - SQL 根据条件仅选择一行以获得两行上的完整状态
- php - 为什么我必须为 phpmailer 使用 include_path 目录?
- windows - 批处理 + 文件 + 一年中的某一天