MySQL实现按datetime降序排序并按user_id分组的查询
实现用户组聚合并按最新时间排序的SQL查询方法
要达成先按用户最新记录的时间降序确定用户组顺序,同一用户的记录聚合在一起,且组内保持时间倒序的需求,有两种常用的SQL写法:
方法一:使用窗口函数(推荐,适用于支持SQL:2003及以上的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
利用窗口函数计算每个用户的最新活动时间,以此作为用户组的排序依据:
SELECT user_id, datetime, activity FROM your_table_name ORDER BY -- 按每个用户的最新时间降序排列用户组 MAX(datetime) OVER (PARTITION BY user_id) DESC, user_id, -- 可选,确保同一用户的记录完全聚合,避免穿插 -- 组内按时间降序排列 datetime DESC;
这里MAX(datetime) OVER (PARTITION BY user_id)会为每条记录生成其所属用户的最新活动时间,排序时先按这个值倒序,就能让最新活跃的用户组排在最前面;再通过user_id确保同一用户的记录不会被拆分,最后组内按datetime倒序排列。
方法二:子查询关联(兼容不支持窗口函数的老版本数据库)
先通过子查询获取每个用户的最新时间,再关联原表完成排序:
SELECT t.user_id, t.datetime, t.activity FROM your_table_name t INNER JOIN ( -- 子查询获取每个用户的最新活动时间 SELECT user_id, MAX(datetime) AS latest_datetime FROM your_table_name GROUP BY user_id ) u ON t.user_id = u.user_id ORDER BY u.latest_datetime DESC, t.user_id, t.datetime DESC;
子查询先计算出每个用户的最新时间,关联后按这个时间倒序排列用户组,再保证同一用户聚合,最后组内按时间降序排序。
内容的提问来源于stack exchange,提问作者user2268244
相关产品推荐
相关产品推荐

