如何在 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...