sql - 如果未找到下一个值,则在第一次出现时存在最大日期和按状态排序
问题描述
我有一张如下表
ID,DATE,Status
359,2021-05-01,M
359,2021-05-01,R
359,2021-04-01,M
759,2021-05-01,R
759,2021-04-01,O
123,2021-05-01,M
123,2021-04-01,O
123,2021-03-31,U
我想要结果如下
359,2021-05-01,R
759,2021-05-01,R
123,2021-05-01,M
日期 - 最大/最晚日期
地位:
- 首选应该是 R(如果找到 R,则退出)
- 如果 R 不存在,则 M
- 如果 M 不存在则 O
- 如果 O 不存在,则 U 等,
有人可以帮我吗?
提前致谢
解决方案
一种方法是row_number()
:
select t.*
from (select t.*,
row_number() over (partition by id order by case status when 'R' then 1 when 'M' then 2 when 'O' then 3 when 'U' then 4 else 5 end
) as seqnum
from t
) t
where seqnum = 1;
如果你知道所有的状态,一个捷径是:
select t.*
from (select t.*,
row_number() over (partition by id order by charindex('RMOU', status)) as seqnum
from t
) t
where seqnum = 1;
推荐阅读
- javascript - 在 javasript 中使用 razor page c# 变量的正确方法是什么?
- c - C 宏扩展,包括编译器开关
- ruby-on-rails-6 - 将 CSS 添加到布局文件 rails 6
- python - python中的十六进制字符串到浮点转换与IEEE-754值不匹配
- powershell - 在不同的域中创建 AD 用户
- mysql - ARel 中的案例陈述
- windows - 如何在 Windows 10 中模拟驱动程序级别的键盘输入?
- excel - Excel,如何计算单词的多条记录
- java - 通过 Spring Boot 连接 mysql 时出现时区问题,相当于 Mitteleuropäische Zeit
- c# - WPF:如何关闭
当在滚动查看器鼠标滚轮动作之外时