2010-01-19 3 views
3

J'ai une requête simple qui s'exécute dans SQL 2008 et utilise une fonction d'agrégation CLR personnalisée, dbo.string_concat qui agrège une collection de chaînes.Comment écrire élégamment un ORDER BY (qui n'est pas valide dans une requête inline) mais nécessaire pour agréger GROUP BY?

J'ai besoin des commentaires classés séquentiellement d'où l'exigence ORDER BY.

La requête que j'ai a une instruction TOP affreuse pour permettre à ORDER BY de fonctionner pour la fonction d'agrégat, sinon les commentaires ne seront pas dans un ordre particulier quand ils sont concaténés par la fonction.

Voici la requête en cours:

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

est-il une façon plus élégante de réécrire cette déclaration?

Répondre

1

Alors ... qu'est-ce que vous voulez est des commentaires concaténés dans l'ordre d'ID puis CommentDate du commentaire le plus récent?

Ne pourriez-vous le faire

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

Edit: Incompris votre objectif. Le mieux que je peux trouver est que vous pouvez nettoyer votre requête un peu en faisant SELECT TOP 100 PERCENT, il utilise toujours un sommet, mais au moins, il a un nombre arbitraire comme limite.

+1

Je ne pense pas que cela fonctionnera, car ORDER BY est la dernière chose qui se produit lorsque la requête est exécutée. La façon dont je le comprends est qu'il a besoin de choses commandées avant de les grouper. – womp

+0

Oui, j'ai besoin que la commande soit exécutée avant le groupe afin que les données agrégées soient ordonnées correctement. En substance, la fonction de concatation produira une liste de commentaires ordonnée dans le temps sous la forme d'un grand varchar (max). – Jafin

+0

Ah, ma mauvaise, j'ai mal compris ce que vous essayiez d'accomplir. – fyjham

1

Puisque vous utilisez SQL Server 2008, vous pouvez utiliser un Common Table Expression:

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 
+0

Nice, mais donne toujours un Msg 1033, niveau 15, état 1, ligne 6 La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP ou FOR XML spécifié. – Jafin

+0

Gah, faible. Vous pourriez avoir besoin d'aller avec une table temporaire: / – womp