SQL中双条件使用RANK()排序时如何保留JobTitle空值新记录
可行实现方案
直接调整窗口函数的排序逻辑,不需要加WHERE条件过滤NULL值,就能同时满足两个要求:既可以拿到每个Email分组下最新的非空JobTitle,又能完整保留JobTitle为NULL的记录。
核心修改逻辑
把原来单字段排序的规则改成两层优先级排序:
- 第一优先级:区分JobTitle是否为空,非空记录的排序优先级高于空值记录,保证非空的有效职位能被优先选中
- 第二优先级:同优先级下按LastUpdated倒序,保证最新更新的记录排在前面
修改后的RANK函数代码如下:
RANK() OVER ( PARTITION BY Email ORDER BY -- 非空JobTitle标记为0排在前面,空值标记为1排在后面,不做删除 CASE WHEN JobTitle IS NOT NULL THEN 0 ELSE 1 END ASC, LastUpdated DESC ) AS [Rank]
效果说明
- 所有JobTitle为NULL的记录会完整保留在结果集中,不会因为过滤丢失
- 每个Email分组下,最新更新的那条带有效JobTitle的记录会排在非空记录的最前位,取
[Rank] = 1就能拿到该用户最新的职位信息 - 空值记录的Rank序号会正常生成,不会干扰有效职位的提取逻辑
如果后续需要拆分统计:要取有效职位就筛选
JobTitle IS NOT NULL AND [Rank] =1,要统计未填写职位的新增用户直接筛选JobTitle IS NULL即可,两类数据互不影响。

内容的提问来源于stack exchange,提问作者Moose
相关产品推荐
相关产品推荐

