0

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

可以使用递归cte吗?

数据:

房子 姓名
1 一种 杰克
1 流行音乐
1 C 安娜
1 C
1 C 佛朗哥
2 一种 乔恩
2 可能
2 C 安娜
3 一种 乔恩
3
3 C
3 C

结果:

房子 不同的名字
1 一种 1
1 1
1 C 3
2 一种 2(杰克和乔恩)
2 2
2 C 3
3 一种 2(杰克和乔恩)
3 3
3 C 3
4

2 回答 2

2

不需要递归 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
于 2021-07-14T18:20:27.283 回答
2

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

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
于 2021-07-14T19:01:03.233 回答