具有排序依据的 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)中,您只能选择/使用与聚合函数(例如SUMMAXMIN)和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 是解决方案,因为你可能知道 AB 属于一起(常见示例:UserIdUserName) 但RDBMS 不知道!

【讨论】:

以上是关于具有排序依据的 SQL 组的主要内容,如果未能解决你的问题,请参考以下文章

带有排序依据的 SQL 分组依据

sql 分组依据和排序依据

按组排序依据Eloquent属于ToMany关系

自定义 SQL 排序依据

带有 LIMIT 和 OFFSET 的 SQL 排序依据。一次对每个匹配的行进行排序

动态/递归 SQL 排序依据