Sélectionnez une ligne avec la valeur MAX() sur une colonne

J'ai un ensemble de données assez simple de bulletins mensuels:

id  | Name          | PublishDate   | IsActive
1   |  Newsletter 1 | 10/15/2012    |     1
2   |  Newsletter 2 | 11/06/2012    |     1  
3   |  Newsletter 3 | 12/15/2012    |     0
4   |  Newsletter 4 | 1/19/2012     |     0

Et etc.

La date de publication est unique.

Résultat (basé sur ci-dessus):

id  | Name          | PublishDate   | IsActive
2   |  Newsletter 2 | 11/06/2012    |     1  

Ce que je veux est assez simple. Je veux juste la newsletter 1 qui IsActive et PublishDate = MAX (PublishDate).

23
demandé sur stevebot 2012-12-07 00:32:43

3 réponses

select top 1 * from newsletters where IsActive = 1 order by PublishDate desc
54
répondu Adam Robinson 2012-12-06 20:41:28

Vous pouvez utiliser row_number():

select id, name, publishdate, isactive
from
(
  select id, name, publishdate, isactive,
    row_number() over(order by publishdate desc) rn
  from table1
  where isactive = 1
) src
where rn = 1

Voir SQL Fiddle avec Démo

Vous pouvez même utiliser une sous-requête qui sélectionne la date max():

select t1.*
from table1 t1
inner join
(
  select max(publishdate) pubdate
  from table1
  where isactive = 1
) t2
  on t1.publishdate = t2.pubdate

Voir SQL jouer avec la Démo

14
répondu Taryn 2012-12-06 20:42:25
CREATE TABLE Tmax(Id INT,NAME VARCHAR(15),PublishedDate DATETIME,IsActive BIT)
INSERT INTO Tmax(Id,Name,PublishedDate,IsActive)
VALUES(1,'Newsletter 1','10/15/2012',1),(2,'Newsletter 2','11/06/2012',1),(3,'Newsletter 3','12/15/2012',0),(4,'Newsletter 4','1/19/2012',0)

SELECT * FROM Tmax

SELECT t.Id
        ,t.NAME
        ,t.PublishedDate
        ,t.IsActive
FROM Tmax AS t
    WHERE PublishedDate=
    (
        SELECT TOP 1 MAX(PublishedDate)
        FROM Tmax
        WHERE IsActive=1
    )
2
répondu Narsimha 2012-12-06 21:06:10