我的table 1
如下所示:
+-----------+------------+------------+ | campaign | start_date | end_date | +-----------+------------+------------+ | campaign1 | 2020-01-01 | 2020-01-03 | | campaign2 | 2020-01-04 | 2020-01-06 | | ... | ... | ... | +-----------+------------+------------+
我想创建table 2
,如下所示:
+-----------+------------+ | campaign | date | +-----------+------------+ | campaign1 | 2020-01-01 | | campaign1 | 2020-01-02 | | campaign1 | 2020-01-03 | | campaign2 | 2020-01-04 | | campaign2 | 2020-01-05 | | campaign2 | 2020-01-06 | | ... | ... | +-----------+------------+
请记住,table 1
的行数将为n
,并将定期添加。我想使用计划查询来计划table 2
的创建。
我和GENERATE_DATE_ARRAY()
一起玩过CROSS JOIN UNNEST
。我还没有找到一种优雅的方法。有什么建议吗?
答案 0 :(得分:2)
[如何]将日期范围转换为日期序列...
以下是BigQuery标准SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'campaign1' campaign, DATE '2020-01-01' start_date, DATE '2020-01-03' end_date UNION ALL
SELECT 'campaign2', '2020-01-04', '2020-01-06'
)
SELECT campaign, day
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) day
-- ORDER BY campaign, day
有结果
Row campaign day
1 campaign1 2020-01-01
2 campaign1 2020-01-02
3 campaign1 2020-01-03
4 campaign2 2020-01-04
5 campaign2 2020-01-05
6 campaign2 2020-01-06
更新-在您的实际用例中使用以下内容(上面只是示例,其中包含问题中的伪数据供您测试)
#standardSQL
SELECT campaign, day
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) day
答案 1 :(得分:0)
您可以使用generate_date_array()
和unnest()
:
select campaign, dte
from (select 'campaign1' as campaign, date('2020-01-01') as start_date, date('2020-01-03') as end_date
) t cross join
unnest(generate_date_array(t.start_date, t.end_date, interval 1 day)) dte;
答案 2 :(得分:0)
另一种方法是创建一个“日历” CTE(或数据库中的表),然后交叉联接并过滤:
with cal as ( select dte from unnest(generate_date_array('2000-01-01','2050-01-01', interval 1 day)) dte),
tbl as (
select 'campaign1' as campaign, cast('2020-01-01' as date) as start_date, cast('2020-01-03' as date) as end_date union all
select 'campaign2','2020-01-04','2020-01-06'
)
select campaign, dte from tbl
cross join cal
where dte between start_date and end_date
order by campaign, dte