sql - 根据案例陈述从分组依据中选择
问题描述
基于这样的表,我想按 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
解决方案
一种方法使用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
(这很诱人)。
推荐阅读
- r - 是否有使用 FactoMineR(或任何其他包)绘制对应分析的第三维的 R 函数?
- html - HTML/JS 为什么包含一个复选框打破行高垂直文本居中
- python-3.x - 将 perl 转换为 python3
- ios - 将评论子项添加到帖子的数据结构中
- html - 是否有将导航栏移动到标题图形下方的代码?
- python - 列表未以预期方式被覆盖
- javascript - 如何检查鼠标是否在画布上的十字形上?
- r - 将 EXCEL OFFSET IN R 用于一系列值和多次
- android - 在 BroadcastReceiver 中启动服务时出错
- python - 如何从不同的视图引用变量(Django)