2013-08-29 12 views
5

Mam strukturę tabeli jak poniżejjak sekwencjonowanie gorups liczba sub

id wstage  wstatus wdate 
101 Unaquired create 2013-08-29 17:07:20.040 
101 Unaquired rework 2013-08-29 18:07:20.040 
101 inprocess accqui 2013-08-29 19:07:20.040 
101 inprocess alloca 2013-08-29 20:07:20.040 
101 Unaquired create 2013-08-29 21:07:20.040 
101 Unaquired rework 2013-08-29 22:07:20.040 

muszę Ten numer jak

id wstage  wstatus wdate     rownumber 
101 Unaquired rework 2013-08-29 22:07:20.040 1 
101 Unaquired create 2013-08-29 21:07:20.040 1 
101 inprocess alloca 2013-08-29 20:07:20.040 2 
101 inprocess accqui 2013-08-29 19:07:20.040 2 
101 Unaquired rework 2013-08-29 18:07:20.040 3 
101 Unaquired create 2013-08-29 17:07:20.040 3 

Próbuję użyć funkcji

select *,ROW_NUMBER() over (partition by id,wstage order by wdate desc) rownumber 

ale to nie daje pożądanego wyniku. Nie chcę używać pl/sql jest tam funkcja rankingu lub proste zapytanie, aby to osiągnąć. mój stół ma 50 milionów rekordów.

+0

W 2012 roku można użyć funkcji 'ROWS'. W 2008 r. Musi to być bardziej złożone zapytanie. Aby uzyskać najlepszą wydajność, być może kursor. –

+0

Nie ma logiki w zestawie wyników. Dlaczego dwa ostatnie wiersze mają 'rownumber = 3'? –

+0

@AndreyGordeev 'rownumber' jest w porządku malejącym według "wdate". aby zmiana w "wstąpieniu" miała wzrosnąć. – Gokul

Odpowiedz

4

Zakładając wdate wartości są unikalne na id, może to wykonać zadanie:

WITH partitioned AS (
    SELECT 
    *, 
    grp = ROW_NUMBER() OVER (PARTITION BY id   ORDER BY wdate DESC) 
     - ROW_NUMBER() OVER (PARTITION BY id, wstage ORDER BY wdate DESC) 
    FROM atable 
), 
maxdates AS (
    SELECT 
    id, wstage, wstatus, wdate, 
    maxwdate = MAX(wdate) OVER (PARTITION BY id, wstage, grp) 
    FROM partitioned 
) 
SELECT 
    id, wstage, wstatus, wdate, 
    rownumber = DENSE_RANK() OVER (PARTITION BY id ORDER BY maxwdate DESC) 
FROM maxdates 
; 

Pierwszy CTE określa odrębne id, wstage wysp, drugi znajdzie maksymalny wdate na wyspie, a głównym zapytań plasuje wiersze oparte na znalezionych maksymalnych wartościach.

Wersja demonstracyjna kodu SQL is available dla tego zapytania.

+0

doskonała. wyjątkowe umiejętności. Twoje zdrowie – Gokul