2012-11-29 12 views
10

Ho una tabella contracts:Come aderire tavolo a se stesso e selezionare i valori massimi in SQL

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

Il contratto con la più grande date essendo il contratto attivo (non me la colpa, la colpa per la creazione di Infor XPPS)

Ho bisogno di creare una query per vedere solo i contratti attivi (un contratto per parte, il contratto con la data più alta).

Così il risultato della query dovrebbe essere simile a questo:

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

Io sono a corto di idee qui, ho cercato di sé unirsi al tavolo, ho provato funzioni di aggregazione, ma non riesco a capirlo. Se qualcuno avrebbe qualche idea, si prega di condividere con me ..

+1

Cosa RDBMS come MySQL o SQL-Server stai usando? –

+1

'query' va bene con un solo' r' ... –

+1

Mi dispiace per quell'errore, sono un po 'stanco seduto tutto il giorno davanti all'emulatore telnet cercando di capire questo querry .. Sto usando il DB/2 su IBM AS/400. –

risposta

16

questo funzionerà su quasi tutti i 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 

se il RDBMS supporta 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

Funziona perfettamente, grazie mille signore! –

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] 
Problemi correlati