2012-11-29 21 views
10

max değerleri kendisine masaya katılmak ve seçmek için: En büyük date aktif kontrat olmaknasıl <code>contracts</code> tablo var SQL

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

sözleşme (beni suçlamayın, ben xpps oluşturmak için Infor suçlarlar

Sadece aktif sözleşmeleri (her parça için bir sözleşme, en yüksek tarihli sözleşmesi) görmek için sorgu oluşturmanız gerekiyor.

Yani sorgu sonucu böyle olmalı:

Burada fikirler dışında yaşıyorum
contractId date  price  partId 
1    20120121 10  1 
3    20130101 15  2 

, ben tablo katılmadan kendini çalıştı, ben toplama işlevlerini çalıştım ama onu anlamaya olamaz. Herkes herhangi bir fikir olurdu, Benimle paylaşmak lütfen ..

+1

MySQL veya SQL-Sunucu kullandığınız nasıldır RDBMS? –

+1

'query 'sadece bir tek' r' ile iyi ... –

+1

Bu hata için özür dilerim, bu querry anlamaya çalışırken telnet emülatörü önünde bütün gün oturan biraz yorgunum .. kullanıyorum IBM AS/400 üzerinde DB/2. –

cevap

16

bu hemen hemen tüm RDBMS,

sizin RDBMS Window Function destekliyorsa

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 
,

üzerinde çalışacak
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

Mükemmel çalışıyor, teşekkürler efendim! –

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]