SQL Server +选择所有不同记录的前1条记录

时间:2010-04-22 09:23:17

标签: sql-server

我正在努力编写查询以产生以下记录。

我有一张记录为

的表格
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排序的记录和当天最新的记录。在这里,我有1,2,3条记录,在一天中的不同时间。在那里我需要按日期desc排序的记录,然后只需要前1个记录。类似的4和5.你能帮我写一个查询。

3 个答案:

答案 0 :(得分: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 - 所以我只是从公用表表达式中选择那些行,我就完成了。

答案 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

答案 2 :(得分: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