Если мы предположим, что у нас есть таблица измерения даты, определенная и заполненная как:
CREATE OR REPLACE TEMPORARY TABLE date_dim (
the_date DATE
)
AS
SELECT DATEADD(DAY, SEQ8(), '2020-03-01'::DATE) AS the_date
FROM TABLE(GENERATOR(ROWCOUNT => 100)) -- assume a 100 row date dim table
;
, а другая таблица данных, определенная и заполненная как:
CREATE OR REPLACE TEMPORARY TABLE testing (
projectid INTEGER
,createdat DATE
,status VARCHAR
)
AS
SELECT $1 AS projectid
,$2::DATE AS createdat
,$3 AS status
FROM VALUES
(21374884, '2020-04-01', 'LIVE')
,(21374884, '2020-04-10', 'COMPLETE')
,(1111111, '2020-04-01', 'LIVE')
,(1111111, '2020-04-10', 'COMPLETE')
;
, то мы можем создать результат, который вы ищете с этим:
WITH cte_x AS (
SELECT projectid
,createdat
,LEAD(createdat) OVER (PARTITION BY projectid ORDER BY createdat) AS nextdat
,status
FROM testing t
)
SELECT cte_x.projectid
,dd.the_date AS createdat
,cte_x.status
FROM cte_x
JOIN date_dim dd
ON dd.the_date >= cte_x.createdat
AND (cte_x.nextdat IS NULL OR dd.the_date < cte_x.nextdat)
WHERE dd.the_date BETWEEN '2020-04-01'::DATE AND '2020-04-15'::DATE
ORDER BY 1,2
;