sql - SQL根据分组后的多个条件获取单行
问题描述
在为以下情况创建查询时需要帮助:
假设我有一个包含以下记录的表
Name Date Time Category CategoryKey
John 10/20/2012 10:00 Low 2
Sam 10/20/2012 10:00 High 4
Harry 10/20/2012 10:00 Medium 1
Michael 10/20/2012 10:00 Grey 3
Rob 10/22/2013 11:00 Low 2
Marry 10/23/2014 12:00 Low 2
Richard 10/23/2014 12:00 Grey 3
Jack 10/24/2015 1:30 High 4
然后如果同一日期和时间有多个名称,则根据以下逻辑强制仅选择一条记录,并在满足以下任一条件时停止。
If Category is Medium then take name
Else If Category is High then take name
Else If Category is Low then take name
Else If Category is Grey then take name
这样最终的结果将是
Name Date Time Category CategoryKey
Harry 10/20/2012 10:00 Medium 1
Rob 10/22/2013 11:00 Low 2
Marry 10/23/2014 12:00 Low 2
Jack 10/24/2015 1:30 High 4
解决方案
最简单的方法是row_number()
:
select t.*
from (select t.*,
row_number() over (partition by date, time
order by (case category when 'Medium' then 1 when 'High' then 2 when 'Low' then 3 when 'Grey' then 4 else 5 end)
) as seqnum
from t
) t
where seqnum = 1;
在这里使用字符串函数会很方便:
row_number() over (partition by date, time
order by charindex(category, 'Medium,High,Low,Grey')
) as seqnum
这适用于您的情况,但您需要注意所有值都包含在内,并且没有一个“包含”另一个值。
推荐阅读
- wordpress - 如何减慢 WordPress 网站的速度
- grails - Grails 3.3.6 没有为命令 gradle docs 触发 DocStart 和 DocEnd 事件
- android - 如何以编程方式关闭运行时权限对话框?
- c# - 使用 Postsharp 在运行时更改属性类变量
- java - Android Studio - 每次按下按钮时从头开始发出声音
- java - net.sf.jasperreports.engine.JRException:从 Jasper 报告中的文件加载对象时出错
- javascript - CSS 背景图像宽度 100% 高度自动
- json - 无法从其他文件调用数据
- unity3d - Unity Editor 非常频繁地冻结
- javascript - JS - 异步函数的解析错误