2013-08-08 3 views
0

어제 물어 본 this 질문에 대한 후속 조치입니다.ROW_NUMBER() 사용시 결과 정렬

SELECT * 
FROM 
(
    SELECT 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1 
     ROW_NUMBER() OVER (PARTITION BY a.guid_column1, b.guid_column1 ORDER BY c.date_column1 DESC) as rn 
    ... 
    -- JOINS AND WHERE STUFF HERE 
    .... 
) t 
WHERE t.rn = 1 

I : 내 원래의 질문을 확장해야하는지 내가 알고하지 않았다
, 나는 새 (... 나와 함께 부담)

SELECT 순간에 이렇게 있습니다를 시작하기로 결정 이 같은 (예상) 결과를 얻을 :

a.guid_column1 b.guid_column1 c.date_column1 d.guid_column1 
------------------------------------------------------------------- 
a1    b1    07/08/2013  someUniqueID 
a2    b2    05/06/2012  someUniqueID 



까다로운 부분은 내가하는 dateadd하여이같은 것을 그 결과를 정렬하려는 것입니다
a.float_column은 물론 항상 동일하지 않습니다 (실제로 나중에 사용자가 입력 함).

SQL에서이 작업을 수행 할 수있는 방법은 SELECT 절에서 새로운 날짜를 계산합니다 쿼리 아래

+2

"a.float_column은 물론 항상 동일하지는 않습니다 (사실 나중에 사용자가 입력 함)." 제발 좀? – Gidil

+0

예! 그것은 내 양식에 사용자가 채우고 일반적으로 1에서 12 사이의 숫자입니다. – seph

+0

검색어를 실행할 때 a.float_column이 항상 입력 되었습니까? – Hazaart

답변

2

(I SQL Server 2005를 사용하고 있습니다)이 있습니다.

a.float_columnNULL 인 경우 아무 것도 원래 날짜에 추가되지 않습니다.

SELECT dateadd(month, ISNULL(t.float_column,0), t.date_column1) as newDate 
    , * 
FROM 
(
    SELECT 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1, a.float_column 
     ROW_NUMBER() OVER (PARTITION BY a.guid_column1, b.guid_column1 ORDER BY c.date_column1 DESC) as rn 
    ... 
    -- JOINS AND WHERE STUFF HERE 
    .... 
) t 
WHERE t.rn = 1 

ORDER BY newDate ASC 
+1

보통 ORDER BY 1은 피해야합니다 (필드가 추가되거나 필드 순서가 변경된 경우). – Gidil

+0

계산 된 열에 대해 별칭을 사용해야합니까? – Hazaart

+0

'a.float_column'과'c.date_column1' 모두 하위 쿼리 내부에서 조인되기 때문에 이것이 작동하지 않을 것이라고 생각하십니까? – seph

0

왜 하위 쿼리에 열을 추가하지 않으시겠습니까?

select * 
from 
(
    select 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1, 
     dateadd(month, a.float_column, c.date_column1) as sort_order, 
     row_number() over (partition by a.guid_column1, b.guid_column1 order by c.date_column1 desc) as rn 
    -- 
    -- JOINS AND WHERE STUFF HERE 
    -- 
) t 
where t.rn = 1 
order by t.sort_order asc