使用下面的示例,第1天A、B、C将分别有1,3,3个不同的名称。在第2天计算每栋房子的不同名称时,将使用第2天之前的数据。在第3天计算每栋房子的不同名称时,使用第3天之前的数据。
可以使用递归cte吗?
数据:
天 | 房子 | 名字|
---|---|---|
1 | A | 千斤顶|
1 | B | Pop[/tr>|
1 | C | Anna//tr>|
1 | C | 露点//tr>|
1 | C | 佛朗哥 |
2 | A | Jon[/tr>|
2 | B | 5月|
2 | C | Anna//tr>|
3 | A | 乔恩 |
3 | B | 肯 |
3 | C | 露点|
3 | C | 露点
如果不知道数据的需求和大小,就很难给出理想/最佳的解决方案。假设一个小数据集需要一种快速而肮脏的计算方法,只需使用这样的子查询。。。
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
不需要递归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