临时表#t1如下:
id code listdate
1 001 2012-01-02 09:10:10
2 002 2012-01-03 15:19:01
3 003 2012-01-01 10:10:01
4 004 2012-01-02 08:11:09
5 005 2012-01-02 09:20:01
6 006 2012-01-02 12:12:09
7 007 2012-01-03 13:08:02
如果我想每天取top 2 的数据出来,要求结果如下:
id code listdate
3 003 2012-01-01 10:10:01
4 004 2012-01-02 08:11:09
1 001 2012-01-02 09:10:10
7 007 2012-01-03 13:08:02
2 002 2012-01-03 15:19:01
我要求能否不要用循环和游标,如何写sql语句来写?
------解决方案--------------------
WITH cte ( pid, code, listdate )
AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY CONVERT(DATE, listdate) ORDER BY id ) pid ,
code ,
listdate
FROM tb
)
SELECT *
FROM TB a
WHERE EXISTS ( SELECT 1
FROM cte b
WHERE a.pid = b.pid
AND a.listdate = b.listdate
AND b.pid <= 2 )
------解决方案--------------------
;WITH c1(id, code, listdate)
AS
(
SELECT 1, '001', '2012-01-02 09:10:10' UNION ALL
SELECT 2, '002', '2012-01-03 15:19:01' UNION ALL
SELECT 3, '003', '2012-01-01 10:10:01' UNION ALL
SELECT 4, '004', '2012-01-02 08:11:09' UNION ALL
SELECT 5, '005', '2012-01-02 09:20:01' UNION ALL
SELECT 6, '006', '2012-01-02 12:12:09' UNION ALL