Ниже для BigQuery Standard SQL
#standardSQL
WITH calendar AS (
SELECT day
FROM (
SELECT MIN(start_date) min_date, MAX(end_date) max_date
FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_date, max_date)) day
)
SELECT day, COUNTIF(day BETWEEN start_date AND end_date) customers
FROM calendar, `project.dataset.table`
GROUP BY day
Вы можете протестировать, поиграть с выше, используя фиктивные данные, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 customer_id, DATE '2017-01-01' start_date, DATE '2017-01-05' end_date UNION ALL
SELECT 2, '2017-01-03', '2017-01-04' UNION ALL
SELECT 3, '2017-01-04', '2017-01-06' UNION ALL
SELECT 4, '2017-01-10', '2017-01-12' UNION ALL
SELECT 5, '2017-01-12', '2017-01-13'
), calendar AS (
SELECT day
FROM (
SELECT MIN(start_date) min_date, MAX(end_date) max_date
FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_date, max_date)) day
)
SELECT day, COUNTIF(day BETWEEN start_date AND end_date) customers
FROM calendar, `project.dataset.table`
GROUP BY day
-- ORDER BY day
с результатом
Row day customers
1 2017-01-01 1
2 2017-01-02 1
3 2017-01-03 2
4 2017-01-04 3
5 2017-01-05 2
6 2017-01-06 1
7 2017-01-07 0
8 2017-01-08 0
9 2017-01-09 0
10 2017-01-10 1
11 2017-01-11 1
12 2017-01-12 2
13 2017-01-13 1