sql - SQL 选择行 IF 条件满足 否则找到最大日期的行
问题描述
我有以下数据结构
Date1 | Date2 | a | b
2018-11-15 | 2010-11-15 | 1 | null
2018-11-15 | 2011-11-15 | 0 | 300
2018-11-15 | 2012-11-15 | 0 | 100
2018-11-14 | 2010-11-15 | 1 | 200
2018-11-14 | 2012-11-15 | 0 | 100
2018-11-13 | 2010-11-15 | 1 | null
2018-11-13 | 2011-11-15 | 0 | 100
对于每个唯一的 Date1 我需要
如果 b 不为空,则选择 a = 1 的行(这样的行只有 1 个)
否则找到 Date2 为最大值的行(无论 b 是否为空)。
所以理想情况下我想得到
Date1 | Date2 | a | b
2018-11-15 | 2012-11-15 | 0 | 100
2018-11-14 | 2010-11-15 | 1 | 200
2018-11-13 | 2011-11-15 | 0 | 100
我假设我需要将 Group BY Date1 和 CASE THEN 条件结合起来,但可以弄清楚它应该如何工作。感谢任何提示。
解决方案
您可以使用row_number()
条件排序:
select date1, date2, a, b
from (
select
t.*,
row_number() over(
partition by date1
order by
case when a = 1 and b is not null then 0 else 1 end,
date2 desc,
b desc
) rn
from mytable t
) t
where rn = 1
是否要通过 justdate1
或date1
and date2
进行分区还不清楚。既然你说你想要最大的记录date2
,我假设你想要分区date1
和排序标准date2 desc
。
最后,我添加了第三个排序标准b desc
,以尝试使结果(更)可预测,如果前两个标准中有联系。
推荐阅读
- python - 如何在 Python unittest 中添加用于集合比较的相等函数
- angular - 如何在 ag-grid 中的一行顶部覆盖控件?
- python - 在没有循环的情况下更改数据框单元格的类型
- ios - 为什么 CarPlay 在真车中会崩溃?
- angular - 我想运行一个从 github 下载的 Angular 项目。但我看到有几个依赖错误
- angular - “FilterMetadata | 类型”上不存在属性“值” > 过滤元数据[]'
- python - 在 python 问题中转向机器人的决策
- docker - Docker:在运行时将自定义端口设置为环境变量,而不是构建
- java - 无法为骆驼计时器创建 MockEndpoint
- reactjs - xcode 错误:使用 Ionic 5 时无法推断成员“UIApplication”的上下文基础