日期:2014-05-17  浏览次数:20543 次

在SQL表中提取每天按code字段分组的前2条记录出来
临时表#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&