2012-12-06 15 views
23

mam dość prosty zestaw danych miesięcznych biuletynach:wybrać jeden wiersz z wartości MAX() w kolumnie

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 

itp

PublishDate jest wyjątkowy.

Wynik (na podstawie wyżej):

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

Co chcę jest dość prosta. Chcę tylko 1 biuletyn IsActive i PublishDate = MAX (PublishDate).

+1

Inne podobne pytania wydawały się dotyczyć partycji danych i agregowania maksymalnej wartości na tych partycjach. Jeśli ktoś uzna to za WYJĄTKOWY duplikat, proszę oznaczyć go jako taki. – stevebot

+2

koleś, wytłumacz swoje zdanie. – stevebot

+0

Więc na podstawie próbki, którą z nich chcesz zwrócić? – Taryn

Odpowiedz

54
select top 1 * from newsletters where IsActive = 1 order by PublishDate desc 
13

Można użyć 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 

Zobacz SQL Fiddle with Demo

Można nawet użyć podzapytania który wybiera datę max():

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

Zobacz SQL Fiddle with Demo

+2

+1 dla Fiddle ... pomogło mi zrozumieć zapytanie – exexzian

2
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 
    ) 
Powiązane problemy