我有下表
日期 | 姓名 |
---|---|
2024-02-01 | 卢克 |
2024-02-01 | 爱丽丝 |
2024-02-01 | 约翰 |
2024-02-01 | 约翰 |
2024-02-02 | 马克 |
2024-02-02 | 爱丽丝 |
2024-02-02 | 马克 |
2024-02-03 | 约翰 |
2024-02-03 | 约翰 |
2024-02-03 | 爱丽丝 |
2024-02-04 | 约翰 |
2024-02-04 | 爱丽丝 |
2024-02-04 | 詹姆斯 |
2024-02-05 | 詹姆斯 |
2024-02-05 | 爱丽丝 |
2024-02-05 | 约翰 |
2024-02-06 | 马克 |
2024-02-06 | 爱丽丝 |
2024-02-06 | 马克 |
2024-02-06 | 爱丽丝 |
2024-02-07 | 约翰 |
2024-02-07 | 爱丽丝 |
我需要计算每个日期的不同名称的数量,回顾窗口为 3 天。这就是我想到的:
select distinct(
date_key,
count(*) over (
partition by date_key
order by unix_timestamp(date_key, 'yyyy-MM-dd')
range between 259200 preceding and current row -- 259200 is 3 days in seconds
)
from my_schema.names_table
然而,这就是我得到的结果
{"col1":"2024-02-01","col2":4}
{"col1":"2024-02-02","col2":3}
{"col1":"2024-02-06","col2":4}
{"col1":"2024-02-07","col2":2}
{"col1":"2024-02-03","col2":3}
{"col1":"2024-02-04","col2":3}
{"col1":"2024-02-05","col2":3}
我不仅无法将其放入自己的列中,而且数字也是错误的,因为结果应该是这样的
日期 | 独特的名字 |
---|---|
1/2/24 | 3 |
2/2/24 | 4 |
3/2/24 | 4 |
4/2/24 | 4 |
5/2/24 | 3 |
6/2/24 | 4 |
7/2/24 | 4 |
非常感谢任何帮助!
创建一个子查询,为应计入最终结果的每个名称/日期组合返回一行(在下面的代码中称为
relevant_dates
)。
然后按日期对中间结果进行分组,并计算每组中的不同名称:
WITH relevant_dates AS
(SELECT Name, explode(sequence(Date, date_add(Date, 2))) AS Date
FROM names_table)
SELECT
Date,
collect_set(Name) AS names,
size(collect_set(Name)) AS unique_names
FROM
relevant_dates
GROUP BY Date
ORDER BY Date
输出:
+----------+--------------------------+------------+
|Date |names |unique_names|
+----------+--------------------------+------------+
|2024-02-01|[Alice, Luke, John] |3 |
|2024-02-02|[Mark, Alice, Luke, John] |4 |
|2024-02-03|[Mark, Alice, Luke, John] |4 |
|2024-02-04|[Mark, Alice, James, John]|4 |
|2024-02-05|[Alice, James, John] |3 |
|2024-02-06|[Mark, Alice, James, John]|4 |
|2024-02-07|[Mark, Alice, James, John]|4 |
|2024-02-08|[Mark, Alice, John] |3 |
|2024-02-09|[Alice, John] |2 |
+----------+--------------------------+------------+