2011-04-05 12 views
26

son dizi ayrıksı alın: Yalnızca benzersiz değerleri id yani birincil anahtar ikamet Bu tablodaBir veritabanı aşağıdaki sütunları içeren tablo var kayıtların

id code value datetime timestamp 

.

Bu tabloda, son tarih değeri temelinde son farklı kayıt kümesini almak istiyorum. Örneğin, aşağıda diyelim benim masa

id code value datetime    timestamp 
1 1023 23.56 2011-04-05 14:54:52 1234223421 
2 1024 23.56 2011-04-05 14:55:52 1234223423 
3 1025 23.56 2011-04-05 14:56:52 1234223424 
4 1023 23.56 2011-04-05 14:57:52 1234223425 
5 1025 23.56 2011-04-05 14:58:52 1234223426 
6 1025 23.56 2011-04-05 14:59:52 1234223427 
7 1024 23.56 2011-04-05 15:00:12 1234223428 
8 1026 23.56 2011-04-05 15:01:14 1234223429 
9 1025 23.56 2011-04-05 15:02:22 1234223430 

Ben kimlikleri 4, 7, 8 ile kayıtları almak istiyor ve 9 yani (datetime değerine bağlı olarak) farklı kodlarla kayıtların son setidir. Vurguladığım şey, bu tablo sonunda milyonlarca kayıt ve yüzlerce bireysel kod değeri içereceğinden, elde etmeye çalıştıklarımın bir örneğidir.

Bunu başarmak için hangi SQL deyimini kullanabilirim? Tek bir SQL deyimiyle halledilemiyorum. Veritabanım MySQL 5.

cevap

50

Bu sizin için çalışmalıdır.

SELECT * 
FROM [tableName] 
WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code) 

id AUTO_INCREMENT ise En son datetime da en yüksek kimliğe sahip olacak şekilde, çok daha pahalı hesaplamak için datetime dert etmeye gerek yoktur.

Güncelleme: bir performans açısından bakıldığında, kayıtların çok sayıda uğraşırken id ve code sütunları endeksli olduğundan emin olun. Birincil anahtar id ise, bu yerleşik, ancak code ve id kapsayan kümelenmemiş bir dizin eklemek gerekebilir.

+1

+1 datetime testinden kaçınmak için + 1 otomatikleştirme ... yanıtı yeniden biçimlendirmek için özgürlüğü aldım. – krtek

+0

Bir çekicilik gibi çalışır! Bunun için çok teşekkürler. –

+1

@smdrager, Very Nice ... zamanımı kurtardı. – vissu

0

böyle bir şey deneyeceğim:

select * from table 
where id in (
    select id 
    from table 
    group by code 
    having datetime = max(datetime) 
) 

(yasal uyarı: Bu test değildir) büyük datetime ile satır da daha büyük id varsa, smdrager önerdiği çözüm

çabuk.

5

bu deneyin:

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (code, datetime, timestamp) IN 
(
    SELECT code, MAX(datetime), MAX(timestamp) 
    FROM <YOUR_TABLE> 
    GROUP BY code 
) 
+0

Tablonun bir ana anahtarı olduğundan, böyle bir karmaşık maddeyi yapmak zorunda değilsin. cevabımı gör. – krtek

+0

@Krtek: Kabul edildi, ancak bu, otomatik artırım olarak kimliğin varsayımını gerektirir. – Chandu

+0

hiç değil, smdrager cevap yapar, benim alt sorgu benim için iyi bir kimlik döndürür çünkü – krtek

1

O var ve eski sonrası, ancak büyük tablolarla @smdrager cevap test çok yavaştı. Bu düzeltmem, "nerde" yerine "iç birleştirme" kullanıyordu.

SELECT * 
FROM [tableName] as t1 
INNER JOIN (SELECT MAX(id) as id FROM [tableName] GROUP BY code) as t2 
ON t1.id = t2.id 

Bu çok hızlı çalıştı.

+0

teşekkürler. Bunu bir daha kullanmam gerektiğinde denerim. –

İlgili konular