2010-01-19 1 views
3

SQL 2008에서 실행되는 간단한 쿼리가 있고 사용자 지정 CLR 집계 함수 인 dbo.string_concat을 사용하여 문자열 모음을 집계합니다.SQL ORDER BY (인라인 쿼리에서 유효하지 않음)를 우아하게 작성하는 방법이지만 집계 GROUP BY에 필요합니까?

의견을 순서대로 주문해야하므로 주문 요구 사항이 필요합니다.

내가 가지고있는 질의에는 집계 함수에서 ORDER BY가 작동하도록하는 끔찍한 TOP 문이 있습니다. 그렇지 않으면 함수에 의해 연결될 때 주석이 특별한 순서가 아닙니다.

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

이 문을 다시 작성하는 더 우아한 방법이 있습니다 :

여기에 현재 쿼리입니까?

답변

1

그래서 ... 당신이 원하는 것은 ID 순으로 연결된 다음 가장 최근 코멘트의 CommentDate입니까?

당신은

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

편집을 할 수 없습니다 : 당신의 목표 오해. 가장 좋은 점은 쿼리를으로 만들면 쿼리를 정리할 수 있다는 것입니다. 여전히 최상위를 사용하고 있지만 적어도 제한된 수의 임의의 숫자를 갖는 것입니다.

+1

ORDER BY 쿼리가 실행될 때 발생하는 마지막 일이기 때문에, 이것은 작동합니다 생각하지 않습니다. 내가 이해하는 방식은 그룹화하기 전에 주문한 물건을 필요로한다는 것입니다. – womp

+0

예 집계 데이터가 올바르게 정렬되도록 그룹 기준 이전에 주문해야합니다. 본질적으로 concat 함수는 시간 순서대로 주석 목록을 하나의 큰 varchar (최대)로 출력합니다. – Jafin

+0

아, 제 잘못, 당신이 성취하려는 것을 오해했습니다. – fyjham

1

SQL Server 2008을 사용하고 있기 때문에, 당신이 사용할 수있는 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

좋은,하지만 여전히 메시지 1033, 수준 15, 상태 1, 줄 6 ORDER BY 절을 사용하면보기, 인라인 함수, 파생 테이블, 하위 쿼리 및 공용 테이블 식에서 유효하지 않습니다. 지정된. – Jafin

+0

가, 약하다. 임시 테이블을 사용해야 할 수도 있습니다. / – womp