如何在SQL中使用递归cte或其他方法累计计算不同的字段?

How to count distinct a field cumulatively using recursive cte or other method in SQL?

使用下面的示例,第 1 天的 A、B、C 分别有 1、3、3 个不同的名称。 在第 2 天计算每个房屋的不同名称时,使用截至第 2 天的数据。 在第 3 天计算每个房屋的不同名称时,使用截至第 3 天的数据。

可以使用递归cte吗?

数据:

房子 姓名
1 一个 杰克
1 B 流行音乐
1 C 安娜
1 C 露珠
1 C 佛朗哥
2 一个 乔恩
2 B 五月
2 C 安娜
3 一个 乔恩
3 B
3 C 露珠
3 C 露珠

结果:

房子 不同的名字
1 一个 1
1 B 1
1 C 3
2 一个 2(杰克和乔恩)
2 B 2
2 C 3
3 一个 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

在不知道数据的需求和大小的情况下,很难给出 ideal/optimal 解决方案。假设一个小数据集需要一种快速而肮脏的计算方式,只需使用这样的子查询...

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