SQL Group с упорядочением по - PullRequest
       12

SQL Group с упорядочением по

9 голосов
/ 10 ноября 2009

Такое ощущение, что у него должно быть базовое решение, но я, похоже, не понимаю его.

Возьмите этот запрос:

            SELECT Category FROM Article
            GROUP BY Category

Я хочу эффективно сделать это:

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

Я на самом деле не хочу выбирать DatePublished, но, похоже, есть смысл заказывать по нему. Это не работает, хотя.

По сути, я хочу упорядочить категории по самой последней статье DatePublished.

Ответы [ 2 ]

20 голосов
/ 10 ноября 2009
SELECT  Category
FROM    Article
GROUP BY
        Category
ORDER BY
        MAX(DatePublished) DESC

Поскольку вы делаете GROUP BY, вам нужно запустить некоторую статистическую функцию над столбцами, не относящимися к группе.

MAX выберет дату последней опубликованной статьи из каждой категории и категории заказа соответственно.

6 голосов
/ 10 ноября 2009

В агрегатах (-> 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 : добавить 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 - это решение, поскольку вы можете знать, что A и B принадлежат друг другу (общий пример: UserId и UserName) но СУБД этого не знает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...