我有一个带有两个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
答案 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排序;