2010-07-14 3 views
1

Je n'arrive pas à trouver l'instruction SQL pour récupérer un ensemble de données spécifique. Lorsque toutes les colonnes sont égales sauf la dernière date de mise à jour, je veux la plus récente. Par exemple.
Requête SQL Récupération de la dernière ligne lorsque les autres colonnes sont égales

Book Author Update 
John Foo  1/21/2010 
John Foo  1/22/2010 
Fred Foo2  1/21/2010 
Fred Foo2  1/22/2010 

Quelle est la requête qui extrait les lignes les plus récentes? Autrement dit, la requête qui retourne:

Book Author Update 
John Foo  1/22/2010 
Fred Foo2  1/22/2010 

TIA,
Steve

+2

Quelle saveur de SQL? Et y a-t-il d'autres colonnes dans le tableau qui doivent être comparées en plus de celles montrées? – harpo

+0

Vous les gars rock! Merci pour toutes les réponses. Tom H. était le premier dans la porte avec la réponse. BTW, votre hypothèse était correcte que j'avais besoin de plus de la requête. Merci pour la deuxième requête. C'est en fait ce dont j'avais besoin. – ptsw

Répondre

4
SELECT 
    book, 
    author, 
    MAX(update) 
FROM 
    My_Table 
GROUP BY 
    book, 
    author 

Cela ne fonctionne que dans ce cas particulier parce que tous des autres colonnes ont la même valeur. Si vous voulez obtenir la dernière ligne par livre, mais où l'auteur (ou une autre colonne que vous récupérerez) peuvent être différentes, vous pouvez alors utiliser:

SELECT 
    T.book, 
    T.author, 
    T.update 
FROM 
    (SELECT book, MAX(update) AS max_update FROM My_Table GROUP BY book) SQ 
INNER JOIN My_Table T ON 
    T.book = SQ.book AND 
    T.update = SQ.max_update 
2

fixe vers le haut

DROP TABLE #tmpBooks 
    CREATE TABLE #tmpBooks 
    (
     Book VARCHAR(100), 
     Author VARCHAR(100), 
     Updated DATETIME 
    ) 

    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/1980') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/1990') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/2000') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/2010') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/1980') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/1990') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/2000') 

    SELECT Book, Author, Max(Updated) as MaxUpdated 
     FROM #tmpBooks 
     GROUP BY Book, Author 

Résultats:

Book   Author   MaxUpdated 
--------------- --------------- ----------------------- 
Foo    Bar    2010-01-01 00:00:00.000 
Foo2   Bar2   2000-01-01 00:00:00.000 

(2 row(s) affected) 
+0

Désolé, bourgeon, ce n'est pas valide SQL. Cela semblait tellement tentant que je l'ai essayé. * "Column 'Update' est invalide dans la clause HAVING car il n'est contenu ni dans une fonction d'agrégat ni dans la clause GROUP BY." * – harpo

+0

@harpo, cela devrait fonctionner maintenant – CaffGeek

+0

En effet ... la syntaxe précédente (HAVING Updated = MAX (Mise à jour)) serait bien quand il y a d'autres lignes que vous voulez obtenir, mais hélas, la seule façon d'exprimer cela est plus verbeuse. – harpo

1

Ceci obtiendra ce que vous avez demandé, mais quelque chose me dit que ce n'est pas ce que vous voulez.

SELECT Book, Author, MAX(Update) 
    FROM BookUpdates 
GROUP BY Book, Author 

Y a-t-il plus au schéma de la table?

0

Essayez ceci (ne pas les données à tester sur, mais il devrait fonctionner):

SELECT 
    bu.Book, 
    bu.Author 
FROM 
    BookUpdates bu 
     JOIN 
    (SELECT MAX(Updated) as Date FROM BookUpdates) max 
WHERE 
    bu.Updated = max.Date; 
Questions connexes