SORU
23 EYLÜL 2008, Salı


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
23 EYLÜL 2008, Salı


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • akalyne

    akalyne

    13 Mayıs 2009
  • Fullscreen

    Fullscreen

    23 Mart 2006