如何解决如何在 SQL 中使用递归 cte 或其他方法累积计算不同的字段?
使用下面的示例,第 1 天将分别为 A、B、C 提供 1、3、3 个不同的名称。 在第 2 天计算每个房屋的不同名称时,将使用第 2 天的数据。 在第 3 天计算每个房屋的不同名称时,将使用截至第 3 天的数据。
可以使用递归 cte 吗?
数据:
日 | 房子 | 姓名 |
---|---|---|
1 | A | 杰克 |
1 | B | 流行 |
1 | C | 安娜 |
1 | C | 露水 |
1 | C | 佛朗哥 |
2 | A | 乔恩 |
2 | B | 五月 |
2 | C | 安娜 |
3 | A | 乔恩 |
3 | B | 肯 |
3 | C | 露水 |
3 | C | 露水 |
结果:
日 | 房子 | 不同的名字 |
---|---|---|
1 | A | 1 |
1 | B | 1 |
1 | C | 3 |
2 | A | 2(杰克和乔恩) |
2 | B | 2 |
2 | C | 3 |
3 | A | 2(杰克和乔恩) |
3 | B | 3 |
3 | C | 3 |
解决方法
不需要递归 CTE。只需标记一个名字在房子里第一次出现的时间并使用累积总和:
select day,house,sum(sum(case when seqnum = 1 then 1 else 0 end)) over (partition by house order by day) as num_unique_names
from (select t.*,row_number() over (partition by house,name order by day) as seqnum
from t
) t
group by day,house
,
如果不知道数据的需求和大小,就很难给出理想/最优的解决方案。假设一个小数据集需要一种快速而肮脏的计算方式,只需使用这样的子查询......
SELECT p.[Day],p.House,(SELECT COUNT(DISTINCT([Name]))
FROM #Bing
WHERE [Day]<= p.[Day] AND House = p.House) DistinctNames
FROM #Bing p
GROUP BY [Day],House
ORDER BY 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。