如何编写统计主被叫通话次数的正确SQL窗口函数查询
解决方案
你需要为两个统计指标分别编写对应的窗口函数,调整PARTITION BY的分区逻辑即可:
- 按日期统计的
[How_many_calls_to_num_per_day]:按[From_Number]、[To_Number]、[Date]三个字段分区,统计同一主叫、同一被叫、同一天的呼叫次数 - 跨日期总统计的
[How_many_calls_to_num]:按[From_Number]、[To_Number]两个字段分区,统计同一主叫对同一被叫的所有历史呼叫总次数
正确的查询语句如下:
SELECT [Date], [From_Number], [To_Number], COUNT(*) OVER (PARTITION BY [From_Number], [To_Number], [Date]) AS [How_many_calls_to_num_per_day], COUNT(*) OVER (PARTITION BY [From_Number], [To_Number]) AS [How_many_calls_to_num] FROM tbl
逻辑说明
你之前的查询存在两个问题:
- 分区逻辑错误:原来只按
[To_Number]和[Date]分区,没有加入[From_Number],统计的是所有号码对某个被叫当天的呼叫次数,不是指定主叫对指定被叫的呼叫次数 - 缺少按日统计的窗口函数,两个指标需要分别用不同分区规则的窗口函数计算,不需要GROUP BY或GROUPING SETS,窗口函数本身就可以在不聚合原数据集的前提下给每行附加统计值。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

