2017-04-06 8 views
-1

Ich versuche, die Zeilen in der folgenden Tabelle zu ordnen, die wie folgt aussieht:SQL Formel für Zeilennummer

| ID | Key | Date | Row| 
***************************** 
| P175 | 5  | 2017-01| 2 | 
| P175 | 5  | 2017-02| 2 | 
| P175 | 5  | 2017-03| 2 | 
| P175 | 12 | 2017-03| 1 | 
| P175 | 12 | 2017-04| 1 | 
| P175 | 12 | 2017-05| 1 | 

Diese Person hat zwei Tasten auf einmal während 2017-03, aber ich mag die Formel Setzen Sie '1' für die Zeilen, in denen Key = 12 ist, da sie die neuesten Datensätze widerspiegelt.

Ich möchte die gleiche Formel auch für die Menschen zu arbeiten, die nicht über Tasten überlappen, für die letzten Aufzeichnungen ‚1‘ setzen:

| ID | Key | Date | Row| 
***************************** 
| P170 | 8  | 2017-01| 2 | 
| P170 | 8  | 2017-02| 2 | 
| P170 | 8  | 2017-03| 2 | 
| P170 | 6  | 2017-04| 1 | 
| P170 | 6  | 2017-05| 1 | 

I Variationen ROW_NUMBER versucht haben() OVER PARTITION BY und DENSE_RANK, können aber die richtige Formel nicht finden. Danke für Ihre Hilfe.

+0

ur Beispieldaten ist verwirrend .... – Teja

+0

die RDBMS verwenden Sie? –

+0

@MigsIsip Ich benutze ssms –

Antwort

2

Zuerst das maximale Datum für den Schlüssel berechnen. Dann nutzen Sie dense_rank():

select t.*, 
     dense_rank() over (partition by id order by max_date desc, key) as row 
from (select t.*, max(date) over (partition by id, key) as max_date 
     from t 
    ) t; 

Wenn die Bereiche für jeden Schlüssel nicht überlappen, können Sie dies mit einer kumulativen Zählung verschieden:

select t.*, count(distinct key) over (partition by id order by date desc) as rank 
from t; 

Dies würde jedoch nicht im ersten Fall arbeiten. Ich finde es nur interessant, dass dies fast dasselbe ist wie die erste Abfrage.

+0

Ich versuchte dies und es funktioniert für einige, aber nicht alle Datensätze - wenn eine Person hat 2 Schlüssel zur gleichen Zeit, wo die neuesten Daten auch gleich sind, zeigen sie alle als 1. In In diesem Fall wäre es egal, welcher Schlüssel eine 1 oder 2 erhält, da sie beide aktuell sind. Kennst du einen Weg um das herum? Vielen Dank. –

+0

@ Joyce. . . Das sollte einfach zu beheben sein. Fügen Sie einfach 'key' als letzte Spalte in' order by' hinzu. –

1

Ich denke, Sie suchen nach etwas, wie diese

select personid, mykey, month, 
     dense_rank() over (partition by personid order by mykey desc) rown 
from personkeys 
order by month 

siehe das Beispiel

http://sqlfiddle.com/#!15/cf751/8