2016-08-09 43 views
2

Ich habe eine Datenbank von Kontakten, die sich für eine Reihe von Veranstaltungen registriert haben. Die Datenbank enthält auch eine Tabelle mit Adressinformationen. Häufig haben einzelne Kontakte mehrere Adressdatensätze.Wie min datediff Wert auf einem Datensatz zu wählen

Ich brauche eine Abfrage, die die Buchung eines Individuums zusammen mit der Postleitzahl aus ihrem letzten Adressdatensatz zurückgibt (relativ zum Datum des Ereignisses).

Ich versuche, min (DATEDIFF) in der Abfrage unten zu verwenden, aber obwohl es den Datumsunterschied zwischen der Ereignisbuchung und der Adressdatensatzerstellung korrekt berechnet, gibt die Abfrage immer noch doppelte Ergebnisse, wo eine Person mehr als eins hat Adressdatensatz. Schätze

wenn jemand bitte raten, wo ich unten falsch in der Abfrage werde, oder beraten auf einem besseren Weg, um das Ergebnis zu erhalten:

SELECT ep.EVENTPLACENO, ad.POSTCODE, min(DATEDIFF(dd,ep.CREATIONDATE,ad.CREATIONDATE)) as datediff 
FROM EVENTPLACE as ep 
LEFT OUTER JOIN EVENTMODULE as em ON em.EVENTMODULENO=ep.EVENTMODULENO 
LEFT OUTER JOIN ADDRESS as ad ON ad.CONTACTNO=ep.CONTACTNO 
WHERE em.EVENTMODULENO = '1111111-2222222-3333333-4444444' 
GROUP BY ep.EVENTPLACENO, ad.POSTCODE 
+0

ROW_NUMBER() OVER hinzufügen (PARTITION BY ep.EVENTPLACENO, ad.POSTCODE ORDER BY DATEDIFF) (dd, ep.CREATIONDATE, ad.CREATIO NDATE)) wie rown dann die Abfrage als eine abgeleitete Abfrage abfragen, Auswahl rown = 1 – Cato

Antwort

1
SELECT ep.EVENTPLACENO, ad.POSTCODE, min(ad.CREATIONDATE) as datediff 
FROM EVENTPLACE as ep 
LEFT OUTER JOIN EVENTMODULE as em ON em.EVENTMODULENO=ep.EVENTMODULENO 
OUTER APPLY (SELECT TOP 1 * FROM ADDRESS ad2 WHERE ad2.CONTACTNO=ep.CONTACTNO ORDER BY DATEDIFF(dd,ep.CREATIONDATE,ad2.CREATIONDATE)) AD 
WHERE em.EVENTMODULENO = '1111111-2222222-3333333-4444444' 
GROUP BY ep.EVENTPLACENO, ad.POSTCODE 

können Sie OUTER JOIN LEFT verwenden BEWERBEN an die Spitze 1 einer Unterabfrage - die Unterabfrage existiert dann für die LINKE Zeile, die Sie der Unterabfrage beitreten - wo die Unterabfrage eine TOP 1 ist, wird 1 zu 1 verbunden (oder 1 zu Null wenn keine Zeile)

+0

Andrew - das funktioniert gut. Ich habe noch nie OUTER APPLY benutzt. Vielen Dank für deine Hilfe. – Jon295087