2012-11-29 8 views
10

Ich habe eine contracts Tabelle:Wie Tabelle mit sich selbst verbinden und wählen Sie Max-Werte in SQL

contractId date  price  partId 
1    20120121 10  1 
2    20110130 9   1 
3    20130101 15  2 
4    20110101 20  2 

Der Vertrag mit dem größten date der aktiven Vertrag ist (Tadeln Sie mich nicht, ich Schuld infor für XPPS Schaffung)

Ich muss Abfrage erstellen, um nur aktive Verträge (ein Vertrag pro Teil, der Vertrag mit dem höchsten Datum) zu sehen.

So das Ergebnis der Abfrage sollte wie folgt sein:

contractId date  price  partId 
1    20120121 10  1 
3    20130101 15  2 

ich hier aus Ideen bin, habe ich versucht, sich selbst auf den Tisch kommt, habe ich versucht, Aggregationsfunktionen, aber ich kann es nicht herausgefunden. Wenn jemand eine Idee hätte, sie mit mir bitte teilen ..

+1

Was RDBMS wie MySQL- oder SQL-Server-verwenden Sie? –

+1

'query' ist in Ordnung mit nur einem einzigen' r' ... –

+1

Es tut mir leid für diesen Fehler, ich bin ein bisschen müde sitzen den ganzen Tag vor Telnet-Emulator versucht, herauszufinden, diese Frage .. Ich benutze die DB/2 auf IBM AS/400. –

Antwort

16

diese Arbeit auf fast alle RDBMs,

SELECT a.* 
FROM tableName A 
     INNER JOIN 
     (
      SELECT partID, MAX(date) maxDate 
      FROM tableName 
      GROUP BY partID 
     ) B on a.partID = b.partID AND 
       a.date = b.maxDate 

wenn Ihr RDBMS unterstützt Window Function,

SELECT contractId ,date, price,partId 
FROM  
(
    SELECT contractId ,date, price,partId, 
      ROW_NUMBER() OVER (PARTITION BY PartID 
           ORDER BY date DESC) rn 
    FROM tableName 
) s 
WHERE rn = 1 
+0

Funktioniert perfekt, vielen Dank Herr! –

3
SELECT c.* 
FROM contracts c 
    INNER JOIN 
    (
     SELECT partId, MAX([date]) AS MaxDate 
     FROM contracts 
     GROUP BY partID 
    ) MaxDate 
     ON c.partId = MaxDate.partID 
      AND c.[date] = MaxDate.[date] 
Verwandte Themen