2012-12-06 58 views
23

我每月通訊的一個非常簡單的數據集:選擇一行與MAX()值的列

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 

的PublishDate是獨一無二的。

結果(以上根據):

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

我要的是非常簡單的。我只想要1時事通訊IsActive和PublishDate = MAX(PublishDate)。

+1

其他類似的問題似乎都是處理數據分區並在這些分區上聚合最大值。如果有人發現這是真實的重複,請標記爲這樣。 – stevebot

+2

哥們請解釋你的downvote。 – stevebot

+0

因此,根據樣本,你想要返回哪一個? – Taryn

回答

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

您可以使用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 

SQL Fiddle with Demo

你甚至可以使用選擇max()日期的子查詢:

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

SQL Fiddle with Demo

+2

+1爲小提琴...它幫助我瞭解查詢 – 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 
    )