问题描述
使用下面的示例,第 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