2016-08-19 2 views
1

Einige Hilfe bitte? Nur ein Anfänger begann hier zu lernen, wie man SQL schreibt und lief auf dieses Problem ein. Ich weiß, wie man die MAX Funktion benutzt, aber ich kann nicht herausfinden, wie man alle diese Anforderungen zusammenschließt. Ich habe zwei Tabellen, Accounts und Books (unten ist ein Beispiel der Daten)SQL Oracle mit Verbindungstabellen und Max Funktionen

Accounts          
ID Series YesorNot Dated Filed  Plan Year  
1 123  Yes   06/12/2015  2015   
2 123  No   06/12/2015  2015   
3 145  Yes   06/06/2015  2015 
4 145  No   02/02/2015  2014   
5 198  Yes   02/03/2015  2015   
6 187  Yes   02/14/2013  2013    
7 153  Yes   01/02/2011  2011   

Books  
Primary Key Date Created ID 
1   06/13/2015  123 
2   06/12/2015  123 
3   06/07/2015  145 
4   02/02/2015  145 
5   02/03/2015  198 

Zwei Tische: Accounts und Books
der Suche nach:
1. Daten, die von der Projekt-ID in beiden Tabellen vorhanden = Primärschlüssel
2. Ich möchte nur eine eindeutige Serie (Serie auch = ID)
3. Ich möchte den MAX (neuesten) Wert von Plan Year, und dann, wenn es Duplikate für Plan Year, brauche ich die MAX (letzten) Wert des Erstellungsdatums.
4. Ich brauche nur die Spalten Project ID, Series, YesorNot, Date Filed, Plan Year so sollte meine Ausgabe wie folgt sein:

Project ID Series YesorNot Dated Filed Plan Year  
1   123  Yes  06/12/2015 2015   
3   145  Yes  06/06/2015 2015   
4   145  No  02/02/2015 2014   
5   198  Yes  02/03/2015 2015 
+0

Dies ist schwierig (aufgrund der Bedingung 3), ohne Sätze von temporären Tabellen zu erstellen und möglicherweise mit ein paar Ausgaben. Wenn YesOrNot = Nein bedeutet dies immer mehrere Zeilen für die gleiche Serie in Konten mit demselben Planjahr? –

+1

Was meinen Sie mit "Daten, die in beiden Tabellen durch die Projekt-ID = Primärschlüssel vorhanden sind"? Was ist eine Projekt-ID? Dann - sind die beiden Tabellen nicht durch Serien in der ersten Tabelle und ID in der zweiten Tabelle abgestimmt? Ich hoffe, Sie haben keine Tabellen, die von mehr als einem Spaltenpaar "angepasst" sind! – mathguy

+0

@BenHamilton - kennen Sie analytische Funktionen? – mathguy

Antwort

0

zuerst die Tabellen verbinden:

SELECT B.Primary_Key as Project_ID, A.Series, A.YesorNot, A.Date_Filed, A.Plan_Year 
FROM Books B 
JOIN Accounts A ON B.ID = A.Series 

Sie in der Lage sein sollte so weit zu kommen (und du solltest es als Teil der Frage geschrieben haben) - wenn du nicht kannst, würde ich sagen, dass du eine andere Karriere finden würdest. Angenommen, Sie könnten jetzt den etwas härteren Teil.

Nun fügen wir eine Zeilennummer auf der Grundlage Ihrer Kriterien

ROW_NUMBER() PARTITION BY (B.Primary_Key, A.Series, A.YesorNot, A.Date_Filed ORDER BY A.Date_Year DESC, B.Date_Created DESC) AS RN 

Nun nehmen Sie nur die erste von der Zeilennummer.

SELECT Project_ID, Series, YesorNot, Date_Filed, Plan_Year 
FROM (
    SELECT B.Primary_Key as Project_ID, A.Series, A.YesorNot, A.Date_Filed, A.Plan_Year, 
     ROW_NUMBER() PARTITION BY (B.Primary_Key, A.Series, A.YesorNot, A.Date_Filed ORDER BY A.Date_Year DESC, B.Date_Created DESC) AS RN 
    FROM Books B 
    JOIN Accounts A ON B.ID = A.Series 
) X 
WHERE RN = 1