Sql server 按字段的计数进行分区

Sql server 按字段的计数进行分区,sql-server,partition-by,Sql Server,Partition By,我有一个带有两个int-fieldsid的表t1,month,我用一些值填充了它。 我希望看到的输出是,一个月内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

我有一个带有两个int-fieldsid的表t1,month,我用一些值填充了它。 我希望看到的输出是,一个月内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子句实现这一点?哪一个更有效?实际上,我的表由数千条记录组成。所以,我想做子查询不是一个好主意!谢谢你的帮助。这是你可以试试的-

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

但从性能的角度来看,我看不出您的原始查询与此查询有多大区别。

相同的解决方案,但使用CTE。 实际上,在这个问题上强行使用窗口功能是没有意义的。 将这两种解决方案与plan explorer进行比较

);以c1为 选择id、月份、计数*作为频率 从t1开始 按id分组,月份 选择id,maxfreq作为maxfreq 来自c1 按id分组
按maxfreq desc订购

给我们看看你的表格结构和一些样品data@Raj您可以在fiddle中找到它。在处理组聚合函数时,您不能使用over子句
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