2017-04-04 8 views
0

Ich habe folgende Daten-Set:auf Bedingungen einer anderen Spalte in PostgreSQL Rangliste basiert 8.0.2

id | date | state 
----------------------- 
    1 | 01/01/17 | high 
    1 | 02/01/17 | high 
    1 | 03/01/17 | high 
    1 | 04/01/17 | miss 
    1 | 05/01/17 | high 
    2 | 01/01/17 | miss 
    2 | 02/01/17 | high 
    2 | 03/01/17 | high 
    2 | 04/01/17 | miss 
    2 | 05/01/17 | miss 
    2 | 06/01/17 | high 

ich erstellen möchten, mit PostgreSQL Version 8.0.2 (kompatibel mit Redshift), eine Spalte rank_state, die in Gruppen von id, die Einträge nach steigender date (beginnend von Rang 0), die nicht haben die state von "Miss". Außerdem wiederholt sich der Rang selbst, wenn der Eintrag eine state von "miss" hat. Die Ausgabe sollte wie folgt aussehen:

id | date | state | rank_state 
------------------------------------ 
    1 | 01/01/17 | high | 0 
    1 | 02/01/17 | high | 1 
    1 | 03/01/17 | high | 2 
    1 | 04/01/17 | miss | 2 
    1 | 05/01/17 | high | 3 
    2 | 01/01/17 | miss | 0 
    2 | 02/01/17 | high | 0 
    2 | 03/01/17 | high | 1 
    2 | 04/01/17 | miss | 1 
    2 | 05/01/17 | miss | 1 
    2 | 06/01/17 | high | 2 

Zum Beispiel ist die vierte Zeile einen Rang von 2 hat, da es state ist „miss“, dh er den Rang eines Zeile 3 wiederholt (das gleiche gilt für Zeilen 9 und 10) . Bitte beachten Sie, dass die Zeilen 6 und 7 sollte Rang haben 0.

Ich habe versucht, die folgenden: ,(case when state is not in ('miss') then (rank() over (partition by id order by date desc) - 1) end) as state_rank und ,rank() over (partition by id order by case when state is not in ('miss') then date end) as state_rank aber weder geben Sie mir das gewünschte Ergebnis. Irgendwelche Ideen wären sehr hilfreich.

Die Frage ist ähnlich dem here, aber ich versuche, eine Lösung unter Verwendung von PostgreSQL Version 8.0.2

+0

Auch Redshift kann ['count()' als Fensterfunktion verwenden] (http://docs.aws.amazon.com/redshift/latest/dg/r_WF_COUNT.html). Hast du die ursprüngliche Antwort versucht? Was war der Fehler, wenn es fehlgeschlagen ist? – pozs

+0

@ pozs Vielen Dank für Ihre Antwort. Ja, ich habe die ursprüngliche Antwort versucht. Ich erhalte den folgenden Fehler: FEHLER: Aggregierte Fensterfunktionen mit einer ORDER BY-Klausel erfordern eine Frame-Klausel. – labrynth

+0

ja, [Rotverschiebung ist etwas anders] (http://docs.aws.amazon.com/redshift/latest/dg/r_Window_function_synopsis.html). Sie benötigen "ZEILEN ZWISCHEN UNBOUNDED PRECEDING UND CURRENT ROW" (nach der 'ORDER BY'-Klausel) - das ist der Standard in PostgreSQL, wenn Sie' ORDER BY' verwenden, also wird es normalerweise weggelassen – pozs

Antwort

0

Sie müssen nur Abbildung frame_clause auf die ursprüngliche Antwort hinzuzufügen, da Redshift es erfordert:

select * 
    , GREATEST(COUNT(case when state != 'miss' then 1 else null end) 
      OVER(PARTITION BY id order by date rows between unbounded preceding and current row) -1 , 0) as state_rank 
from tbl; 
Verwandte Themen