如何在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
使用下面的示例,第 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