首页 > 解决方案 > SQL 为每个组选择最近的记录

问题描述

我正在尝试获取表中每个用户的最新记录:

SELECT *  
FROM Orders 
WHERE State = Active 
GROUP BY UserId
ORDER BY Orders.DateTimePlanned DESC`

但这导致我得到每个用户的最旧记录,我怎样才能得到最新的记录!?更改DESCASC不起作用!

请告诉我!

标签: sqldatetimegreatest-n-per-group

解决方案


您的代码不是有效的标准 SQL。据推测,您正在运行 MySQL 并ONLY_FULL_GROUP_BY禁用了 sql 模式。

您需要过滤数据集而不是聚合它。一个选项使用子查询:

select *  
from orders o
where state = 'Active' and datetimeplanned = (
    select max(o1.datetimeplanned)
    from orders o1
    where o1.userid = o.userid and o1.state = 'Active'
)

您还可以使用窗口函数(仅在 MySQL 8.0 中可用):

select *  
from (
    select o.*, rank() over(partition by userid order by datetimeplanned desc) rn
    from orders o
    where state = 'Active'
) o
where rn = 1

推荐阅读