SQL Group with Order by

qui*_*qui 10 sql sql-server

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

拿这个查询:

            SELECT Category FROM Article
            GROUP BY Category
Run Code Online (Sandbox Code Playgroud)

我想有效地做到这一点:

            SELECT Category, DatePublished FROM Article 
            GROUP BY Category
            ORDER BY DatePublished DESC
Run Code Online (Sandbox Code Playgroud)

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

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

Qua*_*noi 20

SELECT  Category
FROM    Article
GROUP BY
        Category
ORDER BY
        MAX(DatePublished) DESC
Run Code Online (Sandbox Code Playgroud)

既然你做了GROUP BY,你需要在非分组列上运行一些聚合函数.

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


Joh*_*iss 6

在聚合( - > GROUP BY),只能选择与聚合函数(如组合/使用领域SUM,MAX,MIN在上市)和字段GROUP BY-clause.

简单样本:

A    |   B
-----+-----
1    |   2
1    |   3
Run Code Online (Sandbox Code Playgroud)

如果你写SELECT A,B FROM table GROUP BY A,那会产生:

A    |   B
-----+-----
1    |{2,3}
Run Code Online (Sandbox Code Playgroud)

但这是不可能的(B在一行中有2个值!?!).你必须对B它们组合在一起的值做些什么.有两种可能性:

1:添加BGROUP BY-clause

SELECT A,B FROM table GROUP BY A,B
Run Code Online (Sandbox Code Playgroud)

产量

A    |   B
-----+-----
1    |   2
1    |   3
Run Code Online (Sandbox Code Playgroud)

2:使用聚合功能B

SELECT A,MAX(B) FROM TABLE GROUP BY A,B
Run Code Online (Sandbox Code Playgroud)

给你

A    |   B
-----+-----
1    |   3
Run Code Online (Sandbox Code Playgroud)

相同的论点适用于该ORDER BY条款.

大多数时候,当你想写一个像我出现的第一个语句时,可能性1是解决方案,因为你可能知道A并且B属于一起(常见样本:UserIdUserName)但是RDBMS不知道它!