具有排序依据的 SQL 组
Posted
技术标签:
【中文标题】具有排序依据的 SQL 组【英文标题】:SQL Group with Order by 【发布时间】:2009-11-10 15:14:35 【问题描述】:这感觉它应该有一个基本的解决方案,但我似乎没有得到它。
接受这个查询:
SELECT Category FROM Article
GROUP BY Category
我想有效地做到这一点:
SELECT Category, DatePublished FROM Article
GROUP BY Category
ORDER BY DatePublished DESC
我真的不想选择 DatePublished,但按它排序似乎很有意义。但这行不通。
基本上我想按最近的 DatePublished 文章排序。
【问题讨论】:
【参考方案1】:SELECT Category
FROM Article
GROUP BY
Category
ORDER BY
MAX(DatePublished) DESC
由于您执行GROUP BY
,您需要在非分组列上运行一些聚合函数。
MAX
将从每个类别中选择最后发表文章的日期并相应地排序。
【讨论】:
【参考方案2】:在聚合(--> GROUP BY
)中,您只能选择/使用与聚合函数(例如SUM
、MAX
、MIN
)和GROUP BY
子句中列出的字段相结合的字段.
简单示例:
A | B
-----+-----
1 | 2
1 | 3
如果你写SELECT A,B FROM table GROUP BY A
,那将产生:
A | B
-----+-----
1 |2,3
但这是不可能的(B
在一行中有 2 个值!?!)。您还必须对 B
的值进行处理,将它们组合在一起。所以有两种可能:
1:在GROUP BY
子句中添加B
SELECT A,B FROM table GROUP BY A,B
产量
A | B
-----+-----
1 | 2
1 | 3
2:在B
上使用聚合函数
SELECT A,MAX(B) FROM TABLE GROUP BY A,B
给你
A | B
-----+-----
1 | 3
同样的论点适用于ORDER BY
子句。
大多数时候,当你想写一个像我出现的第一个语句时,可能性 1 是解决方案,因为你可能知道 A
和 B
属于一起(常见示例:UserId
和UserName
) 但RDBMS 不知道!
【讨论】:
以上是关于具有排序依据的 SQL 组的主要内容,如果未能解决你的问题,请参考以下文章