2009-04-01 9 views
1

table1 dispose de 3 colonnes:Comment écrire cette instruction SQL

Id UserName SubmittedDate
1 Joe 1/1/2006
2 Joe 1/1/2007
3 Nat 1/1/2008
4 Pat 1/1/2009

Je veux retourner ceci:

Id UserName
2 Joe
3 Nat
4 Pat

Je veux juste juste un enregistrement pour Joe, le plus récent.

Comment écrire cette requête? Merci

Répondre

3
SELECT MAX(ID), UserName 
FROM table 
GROUP BY UserName 

Notez cela suppose que ID plus élevé signifie plus tard. Il n'interroge pas directement dans le champ Date de soumission. Pour cela, utilisez un beaucoup plus complexe Quassnoi :)

+0

Merci, cela semble faire parfaitement. Je pourrais avoir besoin des plus compliqués plus tard. –

+0

Heureux que ça a marché pour vous. Si votre colonne d'ID est un champ d'identité qui s'incrémente automatiquement, cela devrait vous donner des résultats corrects, à condition que la date de soumission soit définie lors de la première insertion de la ligne et qu'elle ne soit jamais modifiée ultérieurement. – BradC

4
SELECT Id, UserName, SubmittedDate 
FROM (
     SELECT Id, UserName, SubmittedDate, 
       ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY SubmittedDate DESC) rn 
     FROM table1 
     ) q 
WHERE rn = 1 
+0

Ceci est un peu sur ma tête, mais je le garderai à l'esprit. J'en aurais peut-être besoin plus tard. Merci beaucoup. –

1

Avec seulement SQL standard:

SELECT Id, UserName 
FROM table1 
JOIN (
    SELECT UserName, MAX(SubmittedDate) AS MaxDate 
    FROM table1 
    GROUP BY UserName 
    ) AS MaxDateTable ON table1.UserName = MaxDateTable.UserName 
WHERE SubmittedDate = MaxDate 
+0

Merci pour la réponse. Chaque exemple aide. –

0

arnaquent @Quassnoi, mais j'aime évangélisatrice l'utilisation de CTEs en place des sous-requêtes et la plupart des points de vue.

WITH 
query1 as(
    SELECT Id, UserName, SubmittedDate, 
      ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY SubmittedDate DESC) rn 
    FROM table1 
     ) 

SELECT Id, UserName, SubmittedDate 
FROM query1 
WHERE rn = 1 
+0

Merci. Je vais devoir étudier celui-ci. Je pourrais en avoir besoin plus tard. –

1

Voici trois solutions possibles. Donnez-leur un essai et voyez ce qui est le mieux pour vos données et votre situation. Gardez à l'esprit que dans les situations où un nom d'utilisateur a deux valeurs submitted_date identiques, les résultats peuvent ne pas correspondre à ce que vous attendiez.

SELECT 
    T1.id, 
    T1.username 
FROM 
    My_Table T1 
INNER JOIN 
    (
    SELECT username, MAX(submitted_date) 
    FROM My_Table T2 GROUP BY username 
) SQ 
    ON SQ.username = T1.username AND SQ.submitted_date = T1.submitted_date 

.

SELECT 
    T1.id, 
    T1.username 
FROM 
    My_Table T1 
WHERE 
    NOT EXISTS 
    (
     SELECT * 
     FROM 
     My_Table T2 
     WHERE 
     T2.username = T1.username AND 
     T2.submitted_date > T1.submitted_date 
    ) 

.

SELECT 
    T1.id, 
    T1.username 
FROM 
    My_Table T1 
LEFT OUTER JOIN My_Table T2 ON 
    T2.username = T1.username AND 
    T2.submitted_date > T1.submitted_date 
WHERE 
    T2.id IS NULL 
+0

Merci. Toujours bon d'avoir des choix. Je pourrais avoir besoin d'eux. Je vais devoir étudier un moment. –

Questions connexes