1 votes

Requête SQL Récupération de la dernière ligne lorsque les autres colonnes sont égales

J'ai du mal à trouver l'instruction SQL permettant de récupérer un ensemble spécifique de données. Lorsque toutes les colonnes sont égales à l'exception de la date de dernière mise à jour, je veux la plus récente. Par exemple.

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 permet de récupérer les lignes les plus récentes ? C'est-à-dire la requête qui renvoie :

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

TIA,
Steve

4voto

Tom H. Points 23783
SELECT
    book,
    author,
    MAX(update)
FROM
    My_Table
GROUP BY
    book,
    author

Cela ne fonctionne que dans ce cas particulier car tous des autres colonnes ont la même valeur. Si vous souhaitez obtenir la dernière ligne par livre, mais que l'auteur (ou une autre colonne que vous récupérerez) peut être différent, vous pouvez 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

2voto

CaffGeek Points 10925

Réparer le problème

    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)

1voto

harpo Points 17399

Vous obtiendrez 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

Le schéma de la table est-il plus complexe ?

0voto

Kaltas Points 1323

Essayez ceci (je n'ai pas de données à tester mais cela devrait fonctionner) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X