2014-02-10 4 views
2

У меня есть ниже запрос:row_number() Над Partition - простой способ

INSERT into @TEST (col1,staffnumber,rn) 
SELECT starttime as col1,staffnumber,ROW_NUMBER() OVER (PARTITION BY StaffNumber ORDER BY STARTTIME DESC) AS rn 
    FROM @TempTable2 t2 
UNION 
SELECT eventdate as col1, staffnumber,ROW_NUMBER() OVER (PARTITION BY StaffNumber ORDER BY EVENTDATE DESC) AS rn 
    FROM @TempTable1 t1 

Но, очевидно, это дает мне следующие значения:

COL1    | staffnumber | rn 
10/02/2014 10:29:24   1   1 
10/02/2014 09:08:19   1   3 
10/02/2014 10:00:23   1   2 
10/02/2014 10:00:29   1   1 

Принимая во внимание, мне это нужно, чтобы показать:

COL1    | staffnumber | rn 
10/02/2014 10:29:24   1   1 
10/02/2014 09:08:19   1   4 
10/02/2014 10:00:23   1   3 
10/02/2014 10:00:29   1   2 

Я могу это сделать, выполнив следующие действия:

INSERT into @TEST1 (col1,staffnumber,rn) 
SELECT convert(time,col1),staffnumber,ROW_NUMBER() OVER (PARTITION BY StaffNumber ORDER BY convert(time,COL1) DESC) AS rn 
FROM @TEST 

Но должен быть более эффективный способ сделать это. Есть идеи?

ответ

4

Вычислить ROW_NUMBER после UNION.

SELECT *, ROW_NUMBER() OVER (PARTITION BY StaffNumber ORDER BY STARTTIME DESC) AS rn 
FROM (
SELECT * FROM T1 
UNION ALL 
SELECT * FROM T2 
) x 

Я подозреваю, что вам нужно UNION ALL.

+1

Это замечательно, спасибо. – user3219693

Смежные вопросы