计数日期范围内的不同,运行 grass_date
Count distinct in a date range, running grass_date
我有一个 table 这样的:
日期
名字
1/1
一个
1/2
b
1/3
c
1/2
一个
1/3
d
并且需要计算每行中日期后 7 天内可用的不同名称。
结果应该是:
日期
计数
解释
1/1
1
一个
1/2
2
a,b
1/3
4
a,b,c,d
我试过这些 count+if、count+case when、滞后函数:
- COUNT(DISTINCT(IF(date_1 在日期之间 - INTERVAL '7' DAY 和日期,名称)))
- lag(count(distinct name), 7) 超过(按日期排序)
没有任何效果,结果是只计算每天的名字。
请指教,万分感谢!
嗯。 . .这是否符合您的要求?
select min_date,
sum(count(*)) over (order by date) as cnt,
array_agg(array_agg(name)) over (order by date) as names
from (select name, min(date) as min_date
from t
group by name
) t
group by min_date;
编辑:
假设每个日期一行,添加一个 window 框架规范:
select min_date,
sum(count(*)) over (order by date rows between 6 preceding and current row) as cnt,
array_agg(array_agg(name)) over (order by date rows between 6 preceding and current row) as names
from (select name, min(date) as min_date
from t
group by name
) t
group by min_date
我有一个 table 这样的:
日期 | 名字 |
---|---|
1/1 | 一个 |
1/2 | b |
1/3 | c |
1/2 | 一个 |
1/3 | d |
并且需要计算每行中日期后 7 天内可用的不同名称。 结果应该是:
日期 | 计数 | 解释 |
---|---|---|
1/1 | 1 | 一个 |
1/2 | 2 | a,b |
1/3 | 4 | a,b,c,d |
我试过这些 count+if、count+case when、滞后函数:
- COUNT(DISTINCT(IF(date_1 在日期之间 - INTERVAL '7' DAY 和日期,名称)))
- lag(count(distinct name), 7) 超过(按日期排序)
没有任何效果,结果是只计算每天的名字。
请指教,万分感谢!
嗯。 . .这是否符合您的要求?
select min_date,
sum(count(*)) over (order by date) as cnt,
array_agg(array_agg(name)) over (order by date) as names
from (select name, min(date) as min_date
from t
group by name
) t
group by min_date;
编辑:
假设每个日期一行,添加一个 window 框架规范:
select min_date,
sum(count(*)) over (order by date rows between 6 preceding and current row) as cnt,
array_agg(array_agg(name)) over (order by date rows between 6 preceding and current row) as names
from (select name, min(date) as min_date
from t
group by name
) t
group by min_date