SQL Server中ROW_NUMBER排序子句里CASE(0/1)与日期结合的用法疑问
问题解析:ORDER BY中整数与日期混用的逻辑
首先要明确核心点:ORDER BY是层级排序,不是把多个列的值合并比较。你看到的dAdmit、CASE结果、dDischarge是三个依次生效的排序维度,而非同一维度下的混合比较——这也是整数(0/1)和日期能共存于ORDER BY子句的原因。
具体排序逻辑拆解
这条代码的排序规则按优先级分为三层:
- 第一优先级:按入院日期
dAdmit升序:同一pHSSid下,先把入院日期相同的记录归为一组。 - 第二优先级:按CASE结果升序:在入院日期相同的组内,
- 若
dDischarge非NULL(已出院),CASE返回0; - 若
dDischarge为NULL(未出院),CASE返回1;
因为升序排序中0 < 1,所以已出院的记录会排在未出院的前面。
- 若
- 第三优先级:按出院日期
dDischarge升序:- 对于已出院的记录(CASE结果为0),再按出院日期从早到晚排序;
- 对于未出院的记录(CASE结果为1),
dDischarge是NULL,SQL Server默认在升序排序中将NULL排在最后,所以这部分记录会集中在同一入院日期组的末尾。
示例验证
假设同一pHSSid下有3条记录:
| dAdmit | dDischarge | CASE结果 |
|---|---|---|
| 2023-01-01 | 2023-01-05 | 0 |
| 2023-01-01 | NULL | 1 |
| 2023-01-01 | 2023-01-03 | 0 |
排序后的最终顺序为:
- 2023-01-01 入院,2023-01-03 出院(CASE=0,出院日期更早)
- 2023-01-01 入院,2023-01-05 出院(CASE=0)
- 2023-01-01 入院,未出院(CASE=1)
为什么这个写法可行?
ORDER BY对每个排序项的要求是「该列/表达式的值可被排序」,而非所有排序项必须是同一数据类型。这里的整数(0/1)和日期是在不同层级独立参与排序的,互相没有转换或比较的需求——就像你先按班级排序,再按性别排序,班级是字符串,性别是整数,完全不冲突。
这种写法常用于医疗、工单等场景:需要将同一批次(如同一入院日)的已完成记录(如已出院)优先排序,未完成记录后置,同时保证已完成记录按完成时间有序。
内容的提问来源于stack exchange,提问作者JimKoz
相关产品推荐
相关产品推荐

