无临时表统计行组:专有SQL系统下成员索赔明细及计数需求
解决方案:使用窗口函数实现明细+分组计数
既然你的系统不支持临时表,那**窗口函数COUNT() OVER()**就是最适合的方案——它能直接在明细查询中,为每条记录计算对应索赔的总记录数,完全不需要临时表或额外的子查询关联。
测试SQL示例
先基于你提供的测试数据,写出完整的查询语句:
declare @t table(claim int, name varchar(50)) insert into @t values(1, 'Anderson'), (1, 'Anderson'), (2, 'Anderson'), (2, 'Anderson'), (3, 'Anderson'), (3, 'Anderson'), (3, 'Anderson'), (3, 'Anderson'), (3, 'Anderson'), (3, 'Anderson'); -- 核心查询:用窗口函数计算每个claim的总记录数 select claim, name, count(*) over(partition by claim) as claim_total_count from @t
执行结果
这条查询会输出你期望的格式:
| claim | name | claim_total_count |
|---|---|---|
| 1 | Anderson | 2 |
| 1 | Anderson | 2 |
| 2 | Anderson | 2 |
| 2 | Anderson | 2 |
| 3 | Anderson | 6 |
| 3 | Anderson | 6 |
| 3 | Anderson | 6 |
| 3 | Anderson | 6 |
| 3 | Anderson | 6 |
| 3 | Anderson | 6 |
原理说明
count(*) over(partition by claim):这个窗口函数会按照claim字段分组,对每组内的所有行计数,然后把这个计数结果附加到该组的每一条明细记录上。- 相比子查询关联(比如
select t.*, (select count(*) from @t where claim = t.claim) as ...),窗口函数的执行效率通常更高,尤其是数据量较大时。
只要你的专有SQL系统支持窗口函数(现在绝大多数SQL系统都支持,包括很多企业级专有系统),这个方案就能直接生效。
内容的提问来源于stack exchange,提问作者jackstraw22
相关产品推荐
相关产品推荐

