如:A表,B表 二个表结构大至类似,三个字段  A表:
id 标识
type 类别 {值:0,1,2,5,9.... 大约有10多个类别吧,数字没有规则的,但总的是可以知的}
username 姓名
adddate  添加时间
现在要求是  把A表的 
类别type=0的最新10条添加到B表中,
类别type=1的最新10条添加到B表中,
类别type=2的最新10条添加到B表中,
类别type=5的最新10条添加到B表中,
.......当然用循环也能实现,但太麻烦了,能不能用一条SQL来实现这样的功能?

解决方案 »

  1.   


    with cte as(
    select *, row_number() over(partition by [type] order by adddate desc) rid from 你的表A
    )
    Insert Into 你的表B(type,username)
    select [type],[username] from cte where rid<=10
      

  2.   

    'row_number' 不是可以识别的 函数名。我的sql还是2000版本的,是不是这个原因?
      

  3.   

    sql2005 以上支持 row_number() over
    sql2000 只能写存储过程了。
      

  4.   


    試試以下:
    insert 表B (type,username)
    select type,username 
    from 表A a 
    where a.id IN (select top 10 * from 表A b where b.id = a.id order by adddate desc)
    order by id,adddate desc
      

  5.   


    --上面第5行更正如下:
    where a.id IN (select top 10 id from 表A b where b.id = a.id order by adddate desc)
      

  6.   

    用checksum试试?
    insert into B表
    select a.*
    from A表 a
    where checksum(*) in (select top 10 checksum(*) from A表 b where a.type=b.type order by adddate desc)
      

  7.   


    你试试这个行不行:
    select ID,
           TYPE,
           username,
           adddate
    from 
    (
    select ID,
           TYPE,
           username,
           adddate,
           (select COUNT(*)
            from A a2
            where a1.type = a2.type
                  and a1.adddate <= a2.adddate
           ) as rownum
    from A a1
    )t
    where rownum <= 10
      

  8.   

    SELECT ID, TYPE, USERNAME, ADDDATE
    FROM A AS T1
    WHERE A.ID IN ( SELECT TOP 10 ID FROM A AS T2 WHERE T1.TYPE = T2.TYPE ORDER BY ADDDATE DESC ) 
      

  9.   

    SELECT ID, TYPE, USERNAME, ADDDATE
    FROM A AS T1
    WHERE T1.ID IN ( SELECT TOP 10 ID FROM A AS T2 WHERE T1.TYPE = T2.TYPE ORDER BY ADDDATE DESC )