SQL按分组排序

12

感觉这应该有一个基本的解决方案,但我似乎没有找到正确的方法。

拿这个查询语句作为例子:

            SELECT Category FROM Article
            GROUP BY Category

我想有效地做到这一点:

            SELECT Category, DatePublished FROM Article 
            GROUP BY Category
            ORDER BY DatePublished DESC

我并不真正想选择DatePublished,但按照它排序似乎是有意义的。 不过这样并不能起作用。

基本上我想要通过最近的DatePublished文章来对类别进行排序。

2个回答

24
SELECT  Category
FROM    Article
GROUP BY
        Category
ORDER BY
        MAX(DatePublished) DESC

由于使用了GROUP BY,您需要在非分组列上运行一些聚合函数。

MAX将选择每个类别中最后发布文章的日期,并相应地排序类别。


6

在聚合操作 (--> 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在一行中有两个值?!)。你需要对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),但是关系数据库管理系统不知道!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接