2016-08-05 38 views
0

Ich habe zwei Tabellen mit einer eins zu viele Beziehung, die ich versuche beizutreten. Die Elterntabelle hat einen eindeutigen Schlüsselwert, der mit der Kindtabelle geteilt wird. Die untergeordnete Tabelle speichert den Verlauf für diesen Schlüssel, sodass mehrere Datensätze vorhanden sind. Beispiel unten.SQL Join eins zu viele Extrakt Wert aus der Gruppe der gleichen Schlüssel Wert, wo die Bedingung erfüllt ist

Was ich brauche, ist den Arbeiter Namen für eine Alert-ID zu extrahieren, wo die Aktion 'Alert Closed' für eine bestimmte Gruppe der gleichen Alert-ID ist. Wenn diese Gruppe derselben Alert-ID keinen Datensatz mit action = 'Alert Closed' enthält, nehmen Sie den Namen des Arbeiters mit dem neuesten Zeitstempel. Mir fehlt das Wissen darüber, wie man Zeitstempelspalten vergleicht. Ich erhalte auch immer noch Duplikate, wenn "Alarm geschlossen" wahr ist.

Tabelle 1

alert_id    
--------- 
123   
456   
537   

Tabelle 2

alert_id worker_name action   timestamp 
--------------------------------------------------------- 
123   system  Alert Created 8/6/2016 8:05:26 
123   james bond Alert Opened 8/6/2016 8:05:30 
123   james bond Alert Closed 8/6/2016 8:05:35 
123   james bond Record updated 8/6/2016 8:05:35 
456   system  Alert Created 8/6/2016 8:05:26 
456   admin  Alert updated 8/6/2016 8:06:14 
537   system  alert created 8/6/2016 8:07:20 
537   Mary hill Alert Closed 8/6/2016 8:08:26 

sollte resultierende Tabelle sein:

alert_id worker_name  
----------------------- 
123   james bond  
456   admin  
537   Mary Hill  
+2

Welche Datenbank verwenden Sie? – m13r

+0

ist dieser Sql Server oder MySql usw.? – EoinS

+0

netezza udb wenn das hilft –

Antwort

3

Dies ist eine Priorisierung Abfrage. Sie können es mit row_number() erreichen. Der Trick ist, das Bestellrecht zu bekommen:

select t2.* 
from (select t2.*, 
      row_number() over (partition by alert_id 
           order by (case when action = 'Alert Closed' then 1 else 2 end), 
             timestamp desc 
           ) as seqnum 
     from t2 
    ) t2 
where seqnum = 1; 
+0

dann würde ich nur verlassen Outer Join dies mit Tabelle ein Recht, da alles, was ich brauche aus Tabelle zwei ist der Name des Mitarbeiters. –

+0

hab es geschafft Das hat den Trick gemacht –