2010-04-22 124 views
4

我正在努力編寫查詢以產生以下記錄。SQL Server +選擇所有不同記錄的前1條記錄

我有記錄的表作爲

c1 c2   c3     c4 c5 c6 

1 John   2.3.2010 12:09:54  4  7 99   
2 mike   2.3.2010 13:09:59  8  6 88 
3 ahmad   2.3.2010 14:09:59  1  9 19 


4 Jim  23.3.2010 16:35:14  4  5 99 
5 run  23.3.2010 12:09:54  3  8 12 

我想只讀取記錄: -

3 ahmad   2.3.2010 14:09:59  1  9 19 
4 Jim  23.3.2010 16:35:14  4  5 99 

我的意思是由列C3和其中一個是最新的,也是一種記錄那一天。在這裏,我有一天,一天,兩天,三天不同時間的記錄。那裏我需要按日期desc排序的記錄,然後只記錄最高1條記錄。同樣的4和5,你可以幫我寫一個查詢。

+0

哪個版本的SQL服務器? – 2010-04-22 09:40:26

回答

9

如果你是SQL Server 2008或2008 R2上,你可以試試這個:

WITH TopPerDay AS 
(
    SELECT 
     c1, c2, c3, c4, c5, C6, 
     ROW_NUMBER() OVER 
      (PARTITION BY CAST(c3 AS DATE) ORDER BY c3 DESC) 'RowNum' 
    FROM dbo.YourTable 
) 
SELECT * 
FROM TopPerday 
WHERE RowNum = 1 

我基本上是按天分區中的數據(使用SQL Server 2008和了DATE型)和訂單由c3列按降序排列。這意味着,對於每一天,最古老的行將有RowNum = 1 - 所以我只是從公用表表達式中選擇這些行,我就完成了。

0

在SQL Server 2005數據庫上試過這個。

SELECT * 
FROM dbo.YourTable t1 
WHERE (t1.c3) = 
(
    SELECT MAX(t2.c3) 
    FROM dbo.YourTable t2 
    WHERE DATEDIFF(dd,t2.c3, t1.c3) = 0 
) 
ORDER BY t1.c3 ASC 
0

感謝您的回覆!

我也找到了解決方案。

select * from 
    (select convert(varchar(10),c3,104) as date, max(c3) as date1 from MYTABLE 
      group by convert(varchar(10),c3,104)) as T1 innerjoin MYTABLE as T2 on 
convert(varchar(10),T2.c3,104) = T1.date and t2.c3 = T2.date1