2017-06-27 6 views
0

Ich versuche, einen Rang über Gruppen von Ganzzahlen zu erhalten, wenn sie nach Datum sortiert sind. Einige der Gruppen haben denselben Wert, werden aber von anderen Gruppen getrennt. Aus diesem Grund kann ich DENSE_RANK nicht verwenden, da es die Ganzzahlen des gleichen Wertes zusammensetzt. Die Werte von 10 unten würden zu der gleichen Gruppe in DENSE_RANK gehören, ich möchte, dass sie in der Ranggruppe 2 sind & 4. Danke für jede Hilfe.SQL-Ranglisten nach Datum sortiert, bevor die Rangordnung angewendet wird

| ID | Date | IntValue | DesiredRankResult | 
| 1 | 01 Jan | 10  | 4     | 
| 1 | 02 Jan | 10  | 4     | 
| 1 | 03 Jan | 20  | 3     | 
| 1 | 04 Jan | 20  | 3     | 
| 1 | 05 Jan | 10  | 2     | 
| 1 | 06 Jan | 10  | 2     | 
| 1 | 07 Jan | 30  | 1     | 
+1

Welche DBMS verwenden Sie? Postgres? Orakel? DB2? Feuervogel? –

+0

Ich verstehe Ihre Logik überhaupt nicht. Kannst du es ausarbeiten? –

+0

Um Ränge zuzuweisen, müssen Sie eine Reihenfolge definieren, die in Ihrem Beispiel die Gruppen Jan. 1 und Jan. 2 zusammen und die Gruppen Jan. 5 und Jan. 6 zusammen bilden. In Ihrem Beispiel sind dies zwei benachbarte Daten. Stimmt es immer, dass nur benachbarte Daten gruppiert werden, oder könnte es eine Lücke in den Daten geben? Wenn ja, wie groß ist die Lücke? Wird es in jeder Gruppe nur zwei Daten geben? –

Antwort

0

Sie können dies tun, mit lead() und eine kumulative Summe verwenden. Ich denke, es sieht so aus:

select t.*, 
     sum(case when next_intval = intval then 0 else 1 end) over (partition by id order by date desc) as DesiredRankResult 
from (select t.*, 
      lead(intval) over (partition by id order by date) as next_intval 
     from t 
    ) t; 
Verwandte Themen