2013-05-31 3 views
1

나는 아주 잘 이해하지 못한다. 나는 이것이 내가 생각하는 바를 명확히하고 싶었다.SQL - OVER 및 ORDERBY

내가 제공 정렬 유형, 기록 상태 및 회의 날짜가있는 경우 :

나는 기본적으로 MeetingDate으로 정렬하고 싶습니다. 정렬 유형이 2, 일 때 모임 날짜순으로 상태별로 정렬하고 싶습니다.

아래 코드가이 작업을 수행합니까? 내 테스트 결과에 의하면,하지만 뭔가를 놓칠 수 있습니다. @SortType 1가하는 경우

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

더 구체적으로, 적절한 코드로 분해 믿는 것입니다 : 나는 단지로 분해 있다고 생각

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

:

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

반대쪽 (@SortType이 2 일 때) :

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      Foo.FK_Status ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

답변

2

CASE @SortType WHEN 2 THEN Foo.FK_Status ENDCASE @SortType WHEN 2 THEN Foo.FK_Status ELSE NULL END과 같습니다. 즉, @SortType = 1 다음 쿼리 효과적으로 경우이 :

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      NULL ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 
1

RowOrder 열에 기재된 시퀀스이어야하지만, 쿼리의 끝에 order by 절 않고있을 것이다 아니오 행이 소트되는 순서를 보증합니다. (A RowOrder 열을 포함하지 않고) 설명 정렬 순서에서 출력을 주문합니다 -

SELECT Foo.* 
FROM Foo 
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC; 

: - :

그래서

SELECT Foo.*, 
     ROW_NUMBER() OVER (ORDER BY 
          CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, 
          Foo.MeetingDate DESC) AS RowOrder 
FROM Foo; 

는 동안, 어떤 순서로 표시 할 수있다.