SELECT * FROM tb a 
WHERE 3>(SELECT COUNT(1) FROM tb b WHERE a.sortid=b.sortid AND b.price<a.price)随意手写,未经测试。假设你表名为tb

解决方案 »

  1.   

    select * from 表名 a where sortid in (select top 3 price from 表名 where sortid=a.sortid)
      

  2.   

    itblog(BegCSharp) 反了,要倒序的price^^
      

  3.   

    declare @t table(id int,sortid varchar(10),price decimal(10,1))
    insert @t select 1, '001', 2.2
    insert @t select 2, '002', 2.5
    insert @t select 3, '001', 1.8
    insert @t select 4, '001', 1.3
    insert @t select 5, '002', 2.6
    insert @t select 6, '003', 2.8
    insert @t select 7, '002', 1.9
    insert @t select 8, '003', 1.5
    insert @t select 9, '002', 1.75
    insert @t select 10, '003', 1.35
    insert @t select 11, '003', 1.45
    insert @t select 12, '001', 1.5
    select distinct sortid,price from @t a where price in (select top 3 price from @t where sortid=a.sortid)
      

  4.   

    更正一下之前的那句:select distinct sortid,price from 表名 a where price in (select top 3 price from 表名 where sortid=a.sortid)
      

  5.   

    这种写法从语句上看好像是取同一sortid的top 3 price这没错,但我老觉得逻辑有问题,可又说不出具体在哪..
      

  6.   

    declare @t table(id int,sortid varchar(10),price decimal(10,1))
    insert @t select 1, '001', 2.2
    insert @t select 2, '002', 2.5
    insert @t select 3, '001', 1.8
    insert @t select 4, '001', 1.3
    insert @t select 5, '002', 2.6
    insert @t select 6, '003', 2.8
    insert @t select 7, '002', 1.9
    insert @t select 8, '003', 1.5
    insert @t select 9, '002', 1.75
    insert @t select 10, '003', 1.35
    insert @t select 11, '003', 1.45
    insert @t select 12, '001', 1.5select * from @t t where(select count(*) from @t where sortid=t.sortid and price<t.price)<3
      

  7.   

    select * from @t t where id in(select top 3 id from @t where sortid=t.sortid order by price)
      

  8.   

    谢谢大家的帮忙!我测试一下,fcuandy(要学的东西还很多) 和lxzm1001(*蓝星之梦*) 的方法都是正确的。lxzm1001(*蓝星之梦*) 的第二种方法也可以,但可能没有考虑到名次重复的问题。itblog(BegCSharp) 的方法执行的结果不对,语句可能有点问题,但也给分了。