如何使用聚合函数获取分组后最新日期行的对应列值?
获取每组最新日期对应NumItems的SQL写法
下面是几种可行的解决办法:
方法一:窗口函数(推荐,支持MySQL8+、PostgreSQL、SQL Server等)
用ROW_NUMBER()给每个客户分组内的记录按日期倒序排号,取排号为1的就是最新那条:
SELECT CustomerId, Date, NumItems FROM ( SELECT CustomerId, Date, NumItems, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY Date DESC) AS rn FROM SALES ) t WHERE rn = 1;
要是同一个客户有多个记录日期相同且都是最新的,想保留所有这些记录,把ROW_NUMBER()换成RANK()就行。
方法二:关联子查询(兼容多数数据库)
先查出每个客户的最大日期,再和原表关联拿到对应的NumItems:
SELECT s.CustomerId, s.Date, s.NumItems FROM SALES s INNER JOIN ( SELECT CustomerId, MAX(Date) AS MaxDate FROM SALES GROUP BY CustomerId ) t ON s.CustomerId = t.CustomerId AND s.Date = t.MaxDate;
这种写法如果同一个客户有多个最新日期的记录,会返回所有符合条件的行。
方法三:聚合函数+CASE(适合部分数据库,比如MySQL)
如果你的数据库允许在聚合函数里用CASE,也可以这么写,但数据量大时性能不如前两种:
SELECT CustomerId, MAX(Date) AS LatestDate, MAX(CASE WHEN Date = (SELECT MAX(Date) FROM SALES s2 WHERE s2.CustomerId = s.CustomerId) THEN NumItems END) AS NumItems FROM SALES s GROUP BY CustomerId;
内容的提问来源于stack exchange,提问作者Daym
相关产品推荐
相关产品推荐

