2012-10-10 15 views
5

Mam tabeli w SQL, tabela jest tak:SQL wybierz Unique listę użytkowników, a także inne dane w zależności od datownika

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email1  | 2012-10-09 12:23:53.253 | 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user2  | email4  | 2012-10-09 11:23:53.253 | 
| user3  | email5  | 2012-10-08 10:29:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 

Chcę wynikiem pokazać

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 

tj. Chcę wybrać listę unikalnych użytkowników i najnowszy adres e-mail z nimi związany.

Innym sposobem wyjaśnienia problemu byłoby, że chcę wybrać pole, które nie jest zawarte w żadnej funkcji zagregowanej ani w klauzuli order by. Próbowałem wielu stwierdzeń z dużą liczbą permutacji Wyróżnionych i Sortuj według, Grupuj według itd., Bez żadnego pożytku.

Próbuję unikać wielu instrukcji.

Proszę, pomóżcie mi z tym.

Odpowiedz

1

Spróbuj tego:

SELECT t2.quotes_user, t2.email_address, t2.Sent_at AS '________Sent_at________' 
FROM 
(
    SELECT quotes_user, MAX(Sent_at) AS MaxDate 
    FROM Table 
    GROUP BY quotes_user 
) t1 
INNER JOIN Table t2 ON t1.quotes_user = t2.quotes_user 
        AND t1.Sent_at = t2.MaxDate 
+1

Działa jak urok. Chociaż nie wiem Jak działa część JOIN, czy mógłbyś poprowadzić mnie do dobrego zasobu? –

+1

@SunnyRGupta - Oto niektóre zasoby: [wikipedia - SQL Joins] (http://en.wikipedia.org/wiki/Join_%28SQL%29), [Kodowanie horroru Wizualne wyjaśnienie połączeń SQL -] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html), [Codeproject - Wizualna reprezentacja SQL Join] (http://www.codeproject.com/Articles/ 33052/Visual-Reprezentacja-SQL-Joins). Co więcej, bardzo polecam [Zapytania SQL dla zwykłych śmiertelników] (http://rads.stackoverflow.com/amzn/click/0201433362) dotyczące podstaw zapytań SQL. –

+1

Wielkie dzięki, ostatnie łącze jest niezwykle cenne: D –

7

Ideą zapytania jest uzyskanie ich maksymalnej wartości Sent_AT dla każdego podkwerendy i dołączenie jej z powrotem do oryginalnej tabeli.

SELECT a.* 
FROM tableName a INNER JOIN 
     (
      SELECT quotes_user, MAX(Sent_AT) maxSENT 
      FROM tableName 
      Group By quotes_user 
     ) b on a.quotes_user = b.quotes_user AND 
       a.Sent_AT = b.maxSent 

SQLFiddle Demo

+0

jakieś problemy? co chcesz wiedzieć więcej? –

0
select quotes_user, email_address, sent_at 
from table_name t1 inner join 
    (select quote_user, max(sent_at) as sent 
    from table_name group by quotes_uaser) t2 
on t1.quotes_user = t2.quotes_user and t1.sent_at = t2.sent 
+1

Ta sama odpowiedź jak w @Mahmoud. Proszę unikać powtarzających się odpowiedzi. –

0
select quote_user, email_adress, max(___sent_at___) from users group by quote_user 

Przypuśćmy największe correponds sent_at z ostatniej wysłanej poczty.

+1

Daje błąd: Kolumna "email_adress" jest niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej ani w klauzuli GROUP BY. –

+0

Przepraszamy, zmiana klauzuli group by "group by quote_user, email_adress" powinna zadziałać. –

+1

Działa, ale nie daje pożądanego wyniku. W rzeczywistości był to pierwszy kod, który sam wypróbowałem. Nie działa, więc wysłano tutaj po kilku kolejnych próbach. –