我需要表格中的前10名结果

时间:2014-08-12 14:08:30

标签: sql sql-server

我需要获得每个地区,市场和名称的前10名结果以及计数最高(差距)的结果。有4个区域有1到N市场。我可以获得前十名,但如果不为每个市场使用联盟,就无法弄清楚如何做到这一点。关于如何做到的任何想法?

SELECT DISTINCT TOP 10 
    Region, Market, Name, Gaps 
FROM
    TableName
ORDER BY 
    Region, Market, Gaps DESC 

2 个答案:

答案 0 :(得分:2)

如果你使用的是SQL Server 2005及更新版本(在这方面你不够具体),一种方法是使用CTE(公用表表达式)。

使用此CTE,您可以按照某些条件对数据进行分区 - 即Region, Market, Name - 并为每个“分区”提供从1开始的所有行的SQL Server编号,按某些条件排序。

所以尝试这样的事情:

;WITH RegionsMarkets AS
(
   SELECT 
       Region, Market, Name, Gaps,
       RN = ROW_NUMBER() OVER(PARTITION BY Region, Market, Name ORDER BY Gaps DESC) 
   FROM 
       dbo.TableName
)
SELECT 
   Region, Market, Name, Gaps
FROM 
   RegionsMarkets
WHERE
   RN <= 10

在这里,我只选择每个“分区”的“第一个”条目(即每个Region, Market, Name元组) - 由Gaps以降序排序。

有了这个,你会得到每个(Region, Market, Name)元组的前10行 - 这会接近你想要的吗?

答案 1 :(得分:1)

我想你想要row_number()

select t.*
from (select t.*,
             row_number() over (partition by region, market order by gaps desc) as seqnum
      from tablename t
     ) t
where seqnum <= 10;

我不确定您是否需要name条款中的partition by。如果您在市场中拥有多个名称,那么这可能就是您所寻求的。 (提示:样本数据和期望的结果确实可以帮助澄清问题。)