如何编写SQL查询获取客户编号对应最大expireDate的关联versionNumber
解决获取客户最大expireDate对应versionNumber的SQL问题
你的原查询存在逻辑问题:当GROUP BY仅指定customerNumber时,versionNumber既不是分组字段,也没有通过聚合函数处理,数据库会随机返回该分组内任意一条记录的versionNumber,这就是结果不符合预期的原因。
以下是几种可行的解决方案:
方法一:使用窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等)
通过ROW_NUMBER()窗口函数按客户分组,每组内按expireDate降序排序,取排序后的第一条记录(即expireDate最大的记录):
SELECT customerNumber, expireDate, versionNumber FROM ( SELECT customerNumber, expireDate, versionNumber, ROW_NUMBER() OVER (PARTITION BY customerNumber ORDER BY expireDate DESC) AS rn FROM customers ) t WHERE rn = 1;
如果同一客户存在多条expireDate同为最大值的记录,且需要保留所有这些记录,可以将ROW_NUMBER()替换为RANK():
SELECT customerNumber, expireDate, versionNumber FROM ( SELECT customerNumber, expireDate, versionNumber, RANK() OVER (PARTITION BY customerNumber ORDER BY expireDate DESC) AS rn FROM customers ) t WHERE rn = 1;
方法二:子查询关联(兼容低版本数据库)
先通过子查询获取每个客户的最大expireDate,再关联原表匹配对应的versionNumber:
SELECT c.customerNumber, c.expireDate, c.versionNumber FROM customers c INNER JOIN ( SELECT customerNumber, MAX(expireDate) AS max_expire FROM customers GROUP BY customerNumber ) t ON c.customerNumber = t.customerNumber AND c.expireDate = t.max_expire;
此方法会返回同一客户所有expireDate等于最大值的记录。
内容的提问来源于stack exchange,提问作者user3637971
相关产品推荐
相关产品推荐

