You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中ROW_NUMBER排序子句里CASE(0/1)与日期结合的用法疑问

问题解析:ORDER BY中整数与日期混用的逻辑

首先要明确核心点:ORDER BY是层级排序,不是把多个列的值合并比较。你看到的dAdmit、CASE结果、dDischarge是三个依次生效的排序维度,而非同一维度下的混合比较——这也是整数(0/1)和日期能共存于ORDER BY子句的原因。

具体排序逻辑拆解

这条代码的排序规则按优先级分为三层:

  1. 第一优先级:按入院日期dAdmit升序:同一pHSSid下,先把入院日期相同的记录归为一组。
  2. 第二优先级:按CASE结果升序:在入院日期相同的组内,
    • 若dDischarge非NULL(已出院),CASE返回0;
    • 若dDischarge为NULL(未出院),CASE返回1;
      因为升序排序中0 < 1,所以已出院的记录会排在未出院的前面。
  3. 第三优先级:按出院日期dDischarge升序:
    • 对于已出院的记录(CASE结果为0),再按出院日期从早到晚排序;
    • 对于未出院的记录(CASE结果为1),dDischarge是NULL,SQL Server默认在升序排序中将NULL排在最后,所以这部分记录会集中在同一入院日期组的末尾。

示例验证

假设同一pHSSid下有3条记录:

dAdmitdDischargeCASE结果
2023-01-012023-01-050
2023-01-01NULL1
2023-01-012023-01-030

排序后的最终顺序为:

  1. 2023-01-01 入院,2023-01-03 出院(CASE=0,出院日期更早)
  2. 2023-01-01 入院,2023-01-05 出院(CASE=0)
  3. 2023-01-01 入院,未出院(CASE=1)

为什么这个写法可行?

ORDER BY对每个排序项的要求是「该列/表达式的值可被排序」,而非所有排序项必须是同一数据类型。这里的整数(0/1)和日期是在不同层级独立参与排序的,互相没有转换或比较的需求——就像你先按班级排序,再按性别排序,班级是字符串,性别是整数,完全不冲突。

这种写法常用于医疗、工单等场景:需要将同一批次(如同一入院日)的已完成记录(如已出院)优先排序,未完成记录后置,同时保证已完成记录按完成时间有序。

内容的提问来源于stack exchange,提问作者JimKoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:39