Bir sütun için Max değerine sahip getirme satır
Tablo: Kullanıcı Kimliği, Değeri, Tarih.
Her kullanıcı Kimliği için max(Tarih) için kullanıcı Kimliği Değerini almak istiyorum. Bu, son tarih olan her kullanıcı Kimliği için değerdir. Bir şekilde bunu yapmak için SQL var mı? (Tercihen Oracle)
Güncelleme:Bir karışıklık için özür dilemek istiyorum: TÜM Userİds lazım. Bu kullanıcı son tarih olduğu ama her kullanıcı Kimliği için, tek satır.
CEVAP
Birçok kişi alt sorgular kullanmak veya başka bir satıcıya özgü bu özellikleri görüyorum, ama ben genelde şu şekilde alt sorgular olmadan bu tür bir sorgu yapmak. İÇERİSİNDE herhangi bir marka çalışması gerektiğini çok normal, standart SQL kullanır.
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.UserId = t2.UserId AND t1."Date" < t2."Date")
WHERE t2.UserId IS NULL;
Diğer bir deyişle, başka bir satır aynı kullanıcı Kimliği ile bulunduğu t1 satır getirme ve büyük bir Tarih.
(Tanımlayıcı "SQL ayrılmış bir kelime.) çünkü" sınırlayıcı Tarih koydum
Durumda t1.""= T2."tarih"Bir, iki katına görünür. tarih Genellikle tablolar auto_inc(seq) tuşuna eg Kimliği vardır. Katlama önlemek için aşağıdaki kullanılabilir
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.UserId = t2.UserId AND ((t1."Date" < t2."Date")
OR (t1."Date" = t2."Date" AND t1.id < t2.id))
WHERE t2.UserId IS NULL;
Re @yorum Farhan:
Burada daha ayrıntılı bir açıklama:
Bir dış t2 ile t1 katılma girişiminde katıl. Varsayılan olarak, t1 tüm sonuçlar döndüeğerayrıca iade t2, bir maç var. Eğer t1, belirli bir satır için t2 maç ise orada hiçbir sorgu yine de t1 ve t2 kullanır sütunları için bir yer tutucu olarak BOŞ satır döndürür. Bu nasıl dış genel olarak iş katılır.
Bu sorguda hüner t2 gibi katılmak eşleşen durum aynı olmalıdır tasarlamaktıraynıkullanıcı kimliği, ve birdaha fazlatarih. Fikir eğer bir satır daha büyük bir tarihi olan t2 varsa, o zaman t1 satır karşılaştırılarak değilolamazbu kullanıcı kimliği için en büyük olaylardan biri. Ama eşleme yoksa -- Yani eğer hiçbir satır varsa t2 ile daha büyük bir tarih daha sırada t1 bildiğimiz o sırada t1 oldu satır ile büyük buluşma için verilen kullanıcı kimliği.
Bu gibi durumlarda maç var hiçbir zaman (), t2 sütun sütun belirtilen durum gelseler bile, NULL -- olacak. Hiçbir satır belirli bir kullanıcı kimliği için büyük bir tarihi bulunduğu durumlar için arıyoruz çünkü WHERE t2.UserId IS NULL
, Bu yüzden kullandık.
Verimli bir şekilde sql server sütun i...
Silme Pandalar sütun değerine göre sat...
Nasıl yayılma birden çok satır için Bo...
SQL Oracle çoklu satır sütun değerleri...
Satır eşleştirmek için düzenli ifade e...