2013-08-29 5 views
5

ich wie eine Tabellenstruktur haben unterwie Anzahl Unter gorups sequenzieren

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 

ich diese wie

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 

an die Nummer habe ich Funktion

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

zu verwenden, versuche aber Dies gibt nicht die gewünschte Ausgabe. Ich möchte pl/sql nicht verwenden, gibt es eine Ranking-Funktion oder einfache Abfrage, um dies zu erreichen. Mein Tisch hat 50 Millionen Einträge.

+0

Im Jahr 2012 könnten Sie die Funktion "ROWS" verwenden. Im Jahr 2008 muss es eine komplexere Abfrage sein. Für die beste Effizienz vielleicht einen Cursor. –

+0

Es gibt keine Logik in Ihrer Ergebnismenge. Warum haben zwei letzte Zeilen 'rownumber = 3'? –

+0

@AndreyGordeev "rownumber" ist in der Reihenfolge von "wdate". Die Änderung der "Wage" -Rennummer sollte inkorrekt sein. – Gokul

Antwort

4

Unter der Annahme, wdate Werte eindeutig sind pro id, könnte dies die Arbeit machen:

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 
; 

Der erste CTE bestimmt deutliche id, wstage Inseln, findet die zweite maximale wdate pro Insel, und die Haupt-Abfrage ordnet die Zeilen basierend auf die gefundenen Maximalwerte.

Eine SQL Fiddle Demo is available für diese Abfrage.

+0

ausgezeichnet. außergewöhnliche Fähigkeiten. Prost – Gokul

Verwandte Themen