none
SQL获取每个分组的第一条记录 RRS feed

  • 问题

  • SQL查询以下伪数据获取粗体字行的记录
    ID,Name,ItemID,Price,CreatedOn
    1 a 1 10.00 xxx1
    2 a 1 12.00 xxx2
    3 b 1 9.00 xxx1
    4 b 1 11.50 xxx2
    5 c 1 20.00 xxx1
    6 a 2 21.00 xxx1
    7 a 2 23.00 xxx2
    8 b 2 35.00 xxx1
    9 c 2 31.00 xxx1
    10 c 2 30.50 xxx2

    获取每个分组中的第一条记录,当ItemID有多条记录时,选取Price最高的
    2010年5月12日 10:23

答案

  • --sql2000
    select *
    from tbname k
    where not exists(select * from tbname where 
     name=k.name and ITemID=K.ITemID and k.price<price 
    )
    --sql2005
    select ID,Name,ItemID,Price,CreatedOnfrom (select *,rn=ROW_NUMBER()over(PARTITION by name,ITemID order by price desc) from tb ) kwhere k.rn=1
    
    • 已标记为答案 dotNetDR_ 2010年5月13日 4:12
    2010年5月12日 11:07
  • 如果该表没有提供ID字段的情况下,是否有解决办法?


    自己生成一个ID

    2000的话 用identity导入临时表

    2005 使用row_number

    • 已标记为答案 dotNetDR_ 2010年5月26日 11:43
    2010年5月13日 8:55

全部回复

  • --sql2000
    select *
    from tbname k
    where not exists(select * from tbname where 
     name=k.name and ITemID=K.ITemID and k.price<price 
    )
    --sql2005
    select ID,Name,ItemID,Price,CreatedOnfrom (select *,rn=ROW_NUMBER()over(PARTITION by name,ITemID order by price desc) from tb ) kwhere k.rn=1
    
    • 已标记为答案 dotNetDR_ 2010年5月13日 4:12
    2010年5月12日 11:07
  • 如果该表没有提供ID字段的情况下,是否有解决办法?
    2010年5月13日 4:14
  • 如果该表没有提供ID字段的情况下,是否有解决办法?


    自己生成一个ID

    2000的话 用identity导入临时表

    2005 使用row_number

    • 已标记为答案 dotNetDR_ 2010年5月26日 11:43
    2010年5月13日 8:55