2010-04-22 118 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