Как элегантно написать SQL ORDER BY (который недопустим во встроенном запросе), но требуется для агрегата GROUP BY? - PullRequest
3 голосов
/ 19 января 2010

У меня есть простой запрос, который выполняется в SQL 2008 и использует собственную функцию агрегирования CLR, dbo.string_concat, которая агрегирует коллекцию строк.

Мне требуются упорядоченные комментарии, следовательно, требование ORDER BY.

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

Вот текущий запрос:

SELECT ID, dbo.string_concat(Comment) 
FROM (
    SELECT TOP 10000000000000 ID, Comment, CommentDate 
    FROM Comments 
    ORDER BY ID, CommentDate DESC
     ) x
GROUP BY ID

Есть ли более элегантный способ переписать это утверждение?

Ответы [ 2 ]

1 голос
/ 19 января 2010

Поскольку вы используете SQL Server 2008, вы можете использовать Общее табличное выражение :

WITH cte_ordered (ID, Comment, CommentDate)
AS
(
    SELECT ID, Comment, CommentDate 
    FROM Comments 
    ORDER BY ID, CommentDate DESC
)
SELECT ID, dbo.string_concat(Comment) 
FROM cte_ordered
GROUP BY ID
1 голос
/ 19 января 2010

Итак ... вы хотите, чтобы комментарии объединялись в порядке идентификатора, а затем CommentDate самого последнего комментария?

Не могли бы вы просто

SELECT ID, dbo.string_concat(Comment)
FROM Comments
GROUP BY ID
ORDER BY ID, MAX(CommentDate) DESC

Редактировать: неправильно понялзадача.Лучшее, что я могу придумать, это то, что вы могли бы очистить ваш запрос, сделав его SELECT TOP 100 PERCENT, он по-прежнему использует вершину, но, по крайней мере, обходит произвольное число в качестве ограничения.

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