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
İ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: greatest-n-per-group.
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:
- İkinci koşul sağa göre daha az değer sol taraf değeri olan birleşim
- 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.
SQL Sütun Max Değeri olan satırları Se...
Nasıl belirli bir değeri olan satırlar...
' '' deyim SEÇİN - çıkı...
MySQL bir sütunda aynı değere sahip ol...
Neden't bir METİN sütun MySQL var...