如何实现SQL表按Title分组、Active优先及指定Date排序的查询?
解决方法
你的需求核心是分组排序:先按每个Title的有效记录(Active=1)的日期升序排列各组,组内优先展示Active=1的记录,再展示同组的其他记录。不需要用GROUP BY(它是用来聚合数据的,不是做排序分组展示的),直接通过ORDER BY结合子查询或窗口函数就能实现。
方案1:使用子查询指定组排序依据
SELECT Title, Date, Active FROM your_table ORDER BY -- 按每个Title对应Active=1的日期升序排列各组 (SELECT Date FROM your_table t2 WHERE t2.Title = t1.Title AND t2.Active = 1) ASC, -- 组内Active值降序,1优先展示 Active DESC, -- 组内日期降序,确保同组内最新记录在前 Date DESC;
方案2:使用窗口函数简化逻辑
如果你的SQL支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),可以用MAX()窗口函数直接获取每组的最新日期(也就是Active=1的日期),写法更简洁:
SELECT Title, Date, Active FROM your_table ORDER BY -- 按每组的最大日期(即Active=1的日期)升序排组 MAX(Date) OVER (PARTITION BY Title) ASC, Active DESC, Date DESC;
逻辑说明
- 外层
ORDER BY的第一个条件:确定整个结果中各组的顺序——以每个Title对应的Active=1的日期升序排列,所以B组(2022-01-01)排在最前,A组(2022-02-01)次之,C组(2022-04-01)最后。 - 第二个条件:组内优先展示
Active=1的记录,所以每个组内有效记录在前。 - 第三个条件:同组内按日期降序,确保最新的记录排在前面(和你的期望结果一致)。
内容的提问来源于stack exchange,提问作者Gobuz MOND
相关产品推荐
相关产品推荐

