2017-06-20 3 views
0

Für eine Tabelle T1Endergebnis Berechnen basierend auf Ergebnisse/ID

+----------+-----------+-----------------+ 
| PersonID | Date | Employment | 
+----------+-----------+-----------------+ 
|  1 | 2/28/2017 | Stayed the same | 
|  1 | 4/21/2017 | Stayed the same | 
|  1 | 5/18/2017 | Stayed the same | 
|  2 | 3/7/2017 | Improved  | 
|  2 | 4/1/2017 | Stayed the same | 
|  2 | 6/1/2017 | Stayed the same | 
|  3 | 3/28/2016 | Improved  | 
|  3 | 5/4/2016 | Improved  | 
|  3 | 4/19/2017 | Worsened  | 
|  4 | 5/19/2016 | Worsened  | 
|  4 | 2/16/2017 | Improved  | 
+----------+-----------+-----------------+ 

Ich versuche, eine Final Result Feld Partitionierung für Beschäftigung/PersonID Felder zu berechnen, basierend auf das letzte Ergebnis/Person im Verhältnis zu früheren Ergebnissen. Was ich damit meine, in der Logik hinter Final Result erklärt:

Für jede Person,

  1. Wenn alle Ergebnisse/Person gleich geblieben ist, dann sollte Ergebnis nur endgültig wird für diese Person „Stayed die gleichen“

  2. Wenn Verschlechtert/Verbesserte in der Ergebnismenge für eine Person ist, soll das Endergebnis das neueste Verschlechterte/Verbessertes Ergebnis für diese Person, unabhängig von‚gleich geblieben‘nach einem W/I Ergebnis.

ZB:

  • Person 1 Endgültiges Ergebnis -> Wir waren die gleichen, wie pro (1)
  • Person 2 Endergebnis -> Verbesserte, gemäß (2)
  • Person 3 Endergebnis -> verschlechtert, gemäß (2)
  • Person 4 Endgültiges Ergebnis -> Verbesserte, wie pro (2)

Gewünschtes Ergebnis:

+----------+-----------------+ 
| PersonID | Final Result | 
+----------+-----------------+ 
|  1 | Stayed the same | 
|  2 | Improved  | 
|  3 | Worsened  | 
|  4 | Improved  | 
+----------+-----------------+ 

Ich weiß, das Fensterfunktion oder Unterabfragen beinhalten könnte, aber ich bin zu kämpfen, dies zu codieren.

+0

partitioniert row_number() erhalten Sie, was Sie mit einem Fall, Ausdruck oder IIF wollen – Matt

Antwort

1

Hmmm. Dies ist eine Priorisierungsanfrage. Das klingt wie row_number() heißt für:

select t1.personid, t1.employment 
from (select t1.*, 
      row_number() over (partition by personid 
           order by (case when employment <> 'Stayed the same' then 1 else 2 end), 
             date desc 
           ) as seqnum 
     from t1 
    ) t1 
where seqnum = 1; 
+0

Würde dies auch funktionieren, wenn ich ein anderes Feld ähnlich wie Beschäftigung hat einen Zusammenhang 'Endergebnis zu berechnen 2' Feld? – AS91

+0

@ AS91. . . Wenn Sie eine andere Frage haben, fragen Sie sie als * eine andere * Frage und nicht als Kommentar. Ändere eine Frage nicht, wenn sie bereits beantwortet wurde - das kann eine Antwort ungültig machen und Downvotes anziehen. –

+0

Ich dachte, ich würde einen Kompromiss zwischen der Vereinfachung eines Problems und der Replikation des Ergebnisses auf einem höheren Niveau erreichen, auf Kosten des Verlierens der Komplexität in Frage. Die Sequenzierung der Ergebnisse basierend auf einem bestimmten Feld ändert dies offensichtlich. Also werde ich versuchen, damit zu gehen und zu dir zurück zu kommen. Vielen Dank. – AS91

Verwandte Themen