Я пытаюсь подсчитать отдельные идентификаторы в течение дня, что прямо вперед, но как подсчитать их за 7 дней назад от текущей даты в окне, 30 дней назад в текущем окне.
Я возвращаюсь на 7/30 строк из текущей строки, но я думаю, что это не будет точно, это может быть больше / меньше 7/30 дней, потому что я думаю, что он просто скользит по количеству строк, так что у вас есть идея справиться с этим?
--mockup data SnowSQL
with test (date,id,a,b,c,d) as(
select $1 as date, $2 as id, $3 as a, $4 as b, $5 as c, $6 as d
from values
('2019-07-15','x_1','ps','e','US','NA'),
('2019-07-15','x_2','ps','e','US','NA'),
('2019-07-15','x_2','ps','e','CA','NA'),
('2019-07-16','x_2','ps','e','CA','NA'),
('2019-07-16','x_3','c','xb','CH','AS'),
('2019-07-17','x_4','ps','e','US','NA'),
('2019-07-17','x_5','c','ps4','CH','AS'),
('2019-07-17','x_6','c','ps4','CH','AS'),
('2019-07-17','x_7','c','ns','CH','AS'),
('2019-07-18','x_7','c','ns','CH','AS'),
('2019-07-18','x_7','c','ns','CH','AS'),
('2019-07-18','x_7','c','ns','CH','AS'),
('2019-07-18','x_7','c','ns','CH','AS'),
('2019-07-19','x_8','c','ps','CH','AS'),
('2019-07-20','x_8','c','ps','CH','AS'),
('2019-07-21','x_8','c','ps','CH','AS'),
('2019-07-22','x_8','c','ps','CH','AS'),
('2019-07-29','x_8','c','ps','CH','AS'),
('2019-08-01','x_8','c','ps','CH','AS'),
('2019-08-02','x_9','c','ps','CH','AS'),
('2019-08-03','y_1','c','ps','CH','AS'),
('2019-08-04','y_8','c','ps','CH','AS'),
('2019-08-05','z_8','c','ps','CH','AS'),
('2019-08-06','a_8','c','ps','CH','AS'),
('2019-08-07','b_8','c','ps','CH','AS'),
('2019-08-07','c_8','c','ns','CH','AS'),
('2019-08-07','e_8','ps','e','US','NA'),
('2019-08-08','f_8','c','xb','CH','AS'),
('2019-08-08','f_8','c','xb','CH','AS'),
('2019-08-08','f_8','c','xb','CH','AS'),
('2019-08-09','f_8','c','xb','CH','AS'),
('2019-08-09','f_8','c','xb','CH','AS'),
('2019-08-09','f_8','c','xb','CH','AS'),
('2019-08-10','gx_8','c','ps','CH','AS'),
('2019-08-11','v_8','c','ps','CH','AS') )
--subquery
select 1 as part,
(
select sum(x)
from (
select count(distinct id) as x
from test
where
date = '2019-07-16'
group by a,b,c,d) ) as dau,
(
select sum(x)
from (
select count(distinct id) as x
from test
where
date between '2019-07-16'::date-interval '7 days' and '2019-07-16'
// <= '2019-07-15'
//and date >= '2019-07-15'::date-interval '7 days'
group by a,b,c,d)) as w,
(select sum(x)
from (
select count(distinct id) as x
from test
where
date <= '2019-07-16'
and date >= '2019-07-16'::date-interval '30 days'
group by a,b,c,d)) as m
union
--window function
select 2,sum(dau),sum(w),sum(m)
from(
select
date,
a,
b,
c,
d,
count(distinct id) over (Partition by date,a,b,c,d Order by date)as dau,
count(distinct id) over (Partition by a,b,c,d Order by date rows between 7 preceding and current row) as w,
count(distinct id) over (Partition by a,b,c,d Order by date rows between 30 preceding and current row) as m
from test
group by
date,
a,
b,
c,
d,
id)
where date='2019-07-16'
group by date
;
1-я часть выполняет подсчет в пределах временного интервала с помощью подзапроса
2-я часть выполняет подсчет с помощью скользящей функции.
ожидаемый результат: оба должны получить одинаковый счет за один и тот же период времени.
range
скользящие оконные рамы, поэтому вам, вероятно, понадобится другой (более дорогой) механизм. - person Gordon Linoff   schedule 20.08.2019Sliding window frame unsupported for function COUNT
- person Ravi Satya Yenugula   schedule 20.08.2019