SQL Group with Order by

时间:2009-11-10 15:14:35

标签: sql sql-server

这感觉应该有一个基本的解决方案,但我似乎没有得到它。

采取此查询:

            SELECT Category FROM Article
            GROUP BY Category

我想有效地做到这一点:

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

我真的不想选择DatePublished,但它似乎有意义。但这不起作用。

基本上我想通过最新的DatePublished文章订购类别。

2 个答案:

答案 0 :(得分:20)

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

由于您执行GROUP BY,因此需要在非分组列上运行某些聚合函数。

MAX将从每个类别和订单类别中选择上次发布文章的日期。

答案 1 :(得分: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在一行中有2个值!?!)。你必须对B的值进行一些操作,它们将它们组合在一起。所以有两种可能性:

1 :在B - 条款中添加GROUP BY

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不知道它!