SORU
12 EKİM 2011, ÇARŞAMBA


SQL Sütun Max Değeri olan satırları Seçin

Belgeler için bu tablo (basitleştirilmiş versiyonu burada) var:

 ------ ------- -------------------------------------- 
| id   | rev   | content                              |
 ------ ------- -------------------------------------- 
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
 ------ ------- -------------------------------------- 

Nasıl kimliği başına bir satır ve önemli rev seçerim?
Yukarıdaki verilerle, sonuç iki satır içermelidir: [1, 3, ...] [2, 1, ..]. KullanıyorumMySQL.

Şu anda yazmak üzerine seviyesinde bağımsız eski devirlerde tespit etmek için while döngü ve kontrolleri kullanın. Ama bu tek yöntem sonucu elde etmek için mi? Orada bir değilSQLçözüm?

Güncelleme
Cevaplar sürüyorSQL bir çözüm, ve here a sqlfiddle demo.

Güncelleme 2
Fiyat soru upvoted yukarıdaki sqlfiddle, ekleme cevaplar upvote oranını aştı sonra fark ettim. Bu niyeti olmamıştır! Kemancevaplar, özellikle kabul edilen yanıta göre.

CEVAP
12 EKİM 2011, ÇARŞAMBA


İlk bakışta...

Tüm ihtiyacınız MAX toplama fonksiyonu GROUP BY bir fıkra:

select id, max(rev)
from YourTable
group by id

Hiç o kadar basit değil, değil mi?

Ben sadece content sütun olarak fark ettim.

Bu SQL çok sık karşılaşılan bir soru: bazı grup tanımlayıcısı. başına bir sütunda bazı max değeri içeren satırı için tüm verileri bulmak Kariyerim boyunca bir çok şey duydum. Aslında benim şimdiki işim teknik röportajda cevapladım soruları.

Aslında, StackOverflow topluluk tek bir etiket sadece böyle bir soru ile başa çıkmak için yarattığı çok yaygın bir durumdur: .

Temel olarak, bu sorunu çözmek için iki yaklaşım vardır:

Basit group-identifier, max-value-in-group ile katılan sorgu Alt

Bu yaklaşım, ilk alt-sorgu group-identifier, max-value-in-group (yukarıda çözüldü) bulabilirsiniz. Sonra alt-sorgu group-identifier max-value-in-group hem eşitlik ile: tablonuzu katılın

select yt.id, yt.rev, yt.contents
from YourTable yt
inner join(
    select id, max(rev) rev
    from YourTable
    group by id
) ss on yt.id = ss.id and yt.rev = ss.rev

Öz ile Katılan sol, verdiği koşullar ve filtreler katılın

Bu yaklaşım içinde, kendisi ile masaya bıraktın. Eşitlik, tabii ki, group-identifier gider. Sonra, 2 akıllı hamle:

  1. İkinci koşul sağa göre daha az değer sol taraf değeri olan birleşim
  2. Adım yaptığınızda 1, aslında max değeri olan satır(lar) sağ tarafında NULL (LEFT JOIN, hatırlıyor musun bir şey?). Daha sonra, birleştirilen sonucu, sağ tarafı NULL tek satır gözüküyor filtresi.

Size sonuna kadar:

select yt1.*
from yourtable yt1
left outer join yourtable yt2
on (yt1.id = yt2.id and yt1.rev < yt2.rev)
where yt2.id is null;

Sonuç

Her iki yaklaşım da aynı sonucu getirir.

group-identifier max-value-in-group ile iki satır varsa iki satır her iki yaklaşımın bir sonucu olacaktır.

Her iki yaklaşım SQL ANSI uyumlu, böylece en sevdiğiniz VERİTABANI ile, bağımsız olarak çalışacak"". lezzet

Her iki yaklaşım da performans dostu, ancak sizin kilometre değişebilir (VERİTABANI, DB Yapısı, Dizinler, vb.). Çok yanlış bir yaklaşım seçerken,kriter. Ve sizin için anlamlı bir hale birini seçin emin olun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Monica Catral

    Monica Catra

    12 NİSAN 2009
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005