DB2中如何获取含空值的最小Timestamp?求对应ID的SQL实现
解决SQL查询:优先返回无日期或日期最小的ID
嘿,我来帮你搞定这个SQL查询的问题!你的需求核心其实是优先返回DATE为空的ID,如果没有这类ID,再返回DATE最小的那个ID对吧?我给你整理了两种可行的方案,完美匹配你提到的几个场景:
方案1:返回符合条件的单个ID(任意一个)
这个方案用窗口函数ROW_NUMBER()来给记录排序,优先把DATE为空的排到最前面,非空的按日期从小到大排序,最后取排名第一的记录:
SELECT ID FROM ( SELECT ID, DATE, -- 排序规则:DATE为空的排最前,然后按DATE升序 ROW_NUMBER() OVER ( ORDER BY CASE WHEN DATE IS NULL THEN 0 ELSE 1 END, DATE ASC ) AS rn FROM Table2 -- 这里添加WHERE子句过滤要查询的ID,比如: -- WHERE ID IN ('01', '03') ) ranked_records WHERE rn = 1;
验证你的场景:
- 仅查询ID01、03:两条记录DATE都非空,03的
2017-06-23比01的2018-04-01小,所以排名第一的是03,返回正确。 - 仅查询01、02、03:02的DATE为空,直接排到第一,返回02,正确。
- 查询全ID01、02、03、04:02和04的DATE都为空,
ROW_NUMBER()会给它们分配1和2(顺序取决于数据库默认排序),所以会返回其中一个,符合你“可返回02或04”的要求。
方案2:返回所有符合条件的ID(比如全ID时返回02和04)
如果你希望所有DATE为空的ID都被返回(而不是任意一个),可以把ROW_NUMBER()换成RANK(),这样所有DATE为空的记录排名都是1:
SELECT ID FROM ( SELECT ID, DATE, RANK() OVER ( ORDER BY CASE WHEN DATE IS NULL THEN 0 ELSE 1 END, DATE ASC ) AS rnk FROM Table2 -- WHERE ID IN ('01', '02', '03', '04') ) ranked_records WHERE rnk = 1;
这个版本在查询全ID时会同时返回02和04,如果你需要这种结果就用这个方案。
为什么之前的MIN(DATE)和NOT EXISTS没成功?
MIN(DATE)会自动忽略NULL值,所以当存在DATE为空的ID时,MIN(DATE)找不到这些记录;而如果用NOT EXISTS来判断,很容易忽略“优先选NULL”的优先级逻辑,窗口函数的方式更直观地处理了排序优先级,逻辑清晰不容易出错。
内容的提问来源于stack exchange,提问作者Alison Aftra
相关产品推荐
相关产品推荐

