SQL Server +选择所有不同记录的前1条记录
问题描述:
我正在努力编写查询以产生以下记录。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,你可以帮我写一个查询。
答
如果你是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
- 所以我只是从公用表表达式中选择这些行,我就完成了。
答
在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
答
感谢您的回复!
我也找到了解决方案。
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
哪个版本的SQL服务器? – 2010-04-22 09:40:26