2013-02-26 94 views
1

行使用SQL Server 2005如何显示的最大日期

表1

ID Date Value 

001 23/01/2012 100 
002 24/02/2012 200 
002 21/01/2012 300 
003 18/02/2012 200 
003 19/02/2012 100 
... 

我想每个ID最多显示(日期)。这个怎么做。

我试过

Select id, max(date), value from table group by id, value

但输出显示的所有行

期望输出

ID Date Value 

001 23/01/2012 100 
002 24/02/2012 200 
003 19/02/2012 100 
... 

需要SQL查询帮助

+2

待办事项组。不需要按值分组,也可以从选择部分中删除值,否则会引发错误 – Meherzad 2013-02-26 04:30:30

+0

如果ID在同一天(最长)出现两次,会发生什么? – pilcrow 2013-02-26 05:57:38

回答

0
with CTE as 
(
Select Id, MAX(Date) as maxdate 
from table1 
Group by Id 
) 
Select t1.ID, t1.Maxdate, t2.Value 
from CTE t1, Table1 t2 
where t1.ID = t2.ID 
and t1.maxdate = t2.date; 

Demo sqlfiddle

1

使用过排名:

select id, 
date, value from (
select id, 
date, value, 
Rank() over (Partition BY ID order by date DESC) rank 
from Table1) a 
where a.rank = 1 
+0

+1我怀疑OP可能实际上需要ROW_NUMBER()ing,而不是RANK()ing,如果可能的话,用'value'打断关系。 – pilcrow 2013-02-26 06:00:39

0

试着这么做

SELECT id, date, value 
FROM table1, (SELECT id, max(date) FROM table1 GROUP BY id) t 
WHERE table1.id =t.id AND table1.date=t.date 
0

期权CTE + RANK()功能

;WITH cte AS 
(
SELECT id, date, value, 
     RANK() OVER (PARTITION BY ID ORDER BY date DESC) AS rn 
FROM Table1 
) 
SELECT * 
FROM cte 
WHERE rn = 1 

上演示

仅ID与EXISTS操作

SELECT t1.id, t1.date, t1.value 
FROM Table1 t1 
WHERE EXISTS(
      SELECT 1 
      FROM Table1 t2 
      WHERE t1.id = t2.id 
      HAVING MAX(t2.date) = t1.date 
      ) 

演示选项上SQLFiddle

期权APPLY操作

SELECT t1.id, t1.date, t1.value 
FROM Table1 t1 CROSS APPLY (
          SELECT 1 AS 'IsMatch' 
          FROM Table1 t2 
          WHERE t1.id = t2.id 
          HAVING MAX(t2.date) = t1.date 
          ) o 

演示上SQLFiddle