我需要获得每个地区,市场和名称的前10名结果以及计数最高(差距)的结果。有4个区域有1到N市场。我可以获得前十名,但如果不为每个市场使用联盟,就无法弄清楚如何做到这一点。关于如何做到的任何想法?
SELECT DISTINCT TOP 10
Region, Market, Name, Gaps
FROM
TableName
ORDER BY
Region, Market, Gaps DESC
答案 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
。如果您在市场中拥有多个名称,那么这可能就是您所寻求的。 (提示:样本数据和期望的结果确实可以帮助澄清问题。)