Таким образом, наивным решением является преобразование данных в разные дни и по отдельным пользователям в день, а затем присоединить их к CTE, чтобы получить результаты:
WITH data AS (
select
hour_dim_utc::timestamp_ntz as hour_dim_utc
,user_id
from values
('2020-03-10 9:50', 1 ),
('2020-03-10 9:51', 3 ),
('2020-03-10 10:51', 3 ),
('2020-03-11 9:52', 1 ),
('2020-03-11 9:53', 2 ),
('2020-03-11 9:54', 0 ),
('2020-03-12 9:55', 0 ),
('2020-03-12 9:56', 1 ),
('2020-03-12 9:57', 3 ),
('2020-03-14 9:58', 2 ),
('2020-03-15 9:59', 3 ),
('2020-03-16 10:00', 2 ),
('2020-03-17 10:01', 2 ),
('2020-03-18 10:02', 0 ),
('2020-03-19 10:04', 11 )
s( hour_dim_utc, user_id)
), distinct_users_days AS (
select distinct
hour_dim_utc::date as day
,user_id
from data
), distinct_days AS (
select distinct
hour_dim_utc::date as day
from data
)
select
a.day
,count(distinct(u.user_id)) as acum_count
from distinct_days as a
join distinct_users_days as u on u.day <= a.day
group by 1 order by 1;
дает:
DAY ACUM_COUNT
2020-03-10 2
2020-03-11 4
2020-03-12 4
2020-03-14 4
2020-03-15 4
2020-03-16 4
2020-03-17 4
2020-03-18 4
2020-03-19 5
в вашем SQL вы делаете WHERE DATEDIFF('month', HOUR_DIM.UTC, CURRENT_DATE) BETWEEN 0 AND 0
было бы более читабельно и производительно сказать WHERE hour_dim.utc >= DATE_TRUNC('month', CURRENT_DATE)