按字段计数分区

时间:2014-09-12 07:09:09

标签: sql-server partition-by

我有一个带有两个int字段(id,month)的表t1,我用一些值填充了它。 我希望看到的输出是,最大值(一个月内的ID数)。我尝试了以下代码,它工作正常:

select id,max(freq) as maxfreq from 
(select id,month,count(*) as freq
from t1
group by id,month) a
group by id
order by maxfreq desc

结果是:

ID  MAXFREQ
1   3
2   3
3   1
4   1

这很好。如何使用over partition by子句实现此目的?哪一个更有效率?实际上,我的表包含数千条记录。所以做一个子查询不会是一个好主意我猜!谢谢你的帮助。这是the fiddle

3 个答案:

答案 0 :(得分:0)

;WITH tmp AS (select id, row_number() over (partition by id, month order by id) rn
         FROM t1)
SELECT t.id, max(tmp.rn) as maxfreq
from t1 t
INNER JOIN tmp ON tmp.id = t.id
GROUP BY t.id

答案 1 :(得分:0)

你可以试试这个 -

select id,max(freq) as maxfreq from 
(select id,row_number() over (partition by id,month ORDER BY id) as freq
from t1
) a
group by id
order by id,maxfreq desc

但从性能的角度来看,我认为您的原始查询与此查询之间没有太大区别。

答案 2 :(得分:0)

相同的解决方案,但使用CTE。 实际上没有必要强行使用窗口函数来解决这个问题。 将这两种解决方案与计划资源管理器进行比较。

;用c1作为 (选择id,month,count(*)作为freq 从t1 按ID分组,月份 ) 选择id,max(freq)作为maxfreq 来自c1 按ID分组 按maxfreq desc排序;