SQL查询为每个值选择前2名

SQL查询为每个值选择前2名,sql,tsql,Sql,Tsql,我有一个有3列的表,第1列中的数据有重复的值,第3列有总计,我想做的是返回第1列中每个值的前2个总计 我创建此表的查询如下: SELECT service,name, total FROM [test].[dbo].[TestTable] join test1.dbo.service on substring(servan,0,4)=servicebn where substring(servan,0,4)=servicebn and name <> testname

我有一个有3列的表,第1列中的数据有重复的值,第3列有总计,我想做的是返回第1列中每个值的前2个总计

我创建此表的查询如下:

SELECT service,name, total
  FROM [test].[dbo].[TestTable]
  join test1.dbo.service
  on substring(servan,0,4)=servicebn
  where substring(servan,0,4)=servicebn and name <> testname
group by service,name,total
order by service,total desc
如果您使用的是SQL Server 2005+,您可以使用公共表表达式和窗口函数,我们将非常感谢您的帮助


作为旁注,此查询的性能很差,因为它需要对每个表进行完整的表扫描。原因是连接条件substringservan,0,4=servicebn。它不使用索引。

谢谢JW,关于连接,应该如何最大限度地提高性能?不要在值周围使用函数。创建另一个与substringservan的值0,4相同的列,并在其上定义索引。使用该新列加入servicebnOK。谢谢你的帮助。
WITH recordsList
AS
(
    SELECT  service, name, total,
            DENSE_RANK() OVER (PARTITION BY service 
                                ORDER BY total DESC) rn
    FROM    [test].[dbo].[TestTable]
            INNER join test1.dbo.servd
                on substring(servan,0,4)=servicebn
    where   substring(servan,0,4) = servicebn and 
            name <> testname
)
SELECT  service, name, total
FROM    recordsLIst
WHERE   rn <= 2