首页 > 解决方案 > 根据案例陈述从分组依据中选择

问题描述

基于这样的表,我想按 PRODID 分组,然后根据 case 语句选择一行。案例语句是如果 IND1 = 1 选择行,否则如果 IND2 = 1 选择行,否则选择具有最大 DATE 的行。如果组内的多个指标为 1,则选择指标组中最大日期为 1 的行。


PRODID   IND1       IND2       DATE
---------------------------------------------------
1          1         0      4/24/2020
1          0         0      1/2/2020
1          1         0      1/1/2020
2          0         1      4/24/2020
2          0         1      1/1/2020
3          0         0      4/24/2020
3          0         0      1/1/2020
4          1         0      2/2/2020
4          0         1      4/24/2020
4          0         1      4/24/2020

PRODID   IND1       IND2       DATE
---------------------------------------------------
1          1         0      4/24/2020
2          0         1      4/24/2020
3          0         0      4/24/2020
4          1         0      2/2/2020

标签: sqloracle

解决方案


一种方法使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by prodid
                                order by (case when ind1 > 0 then 1 else 2 end),
                                         (case when ind1 = 0 and ind2 > 0 then 1 else 2 end),
                                         date desc
                               ) as seqnum

      from t
     ) t
where seqnum = 1;

如果你喜欢算术,这可以简化为:

select t.*
from (select t.*,
             row_number() over (partition by prodid
                                order by ind1 desc, ind2 * (1 - ind1) desc, date desc
                               ) as seqnum

      from t
     ) t
where seqnum = 1;

请注意,将逻辑放在一起的一个技巧是确保在以下情况下使用第一行:

1       0      0      2020-01-21
1       1      0      2020-01-20
1       1      1      2020-01-19

这就是为什么你不能使用order by ind1 desc, ind2 desc, date desc(这很诱人)。


推荐阅读