首页 > 解决方案 > 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 我需要

所以理想情况下我想得到

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 条件结合起来,但可以弄清楚它应该如何工作。感谢任何提示。

标签: sqlgroup-bycase

解决方案


您可以使用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

是否要通过 justdate1date1 and date2进行分区还不清楚。既然你说你想要最大的记录date2,我假设你想要分区date1和排序标准date2 desc

最后,我添加了第三个排序标准b desc,以尝试使结果(更)可预测,如果前两个标准中有联系。


推荐阅读