我正在尝试根据某些条件从1条记录中创建更多记录。例如:如果用户购买了每月套餐,则该表将创建直到截止日期为止的每周的记录。
从此表:
|Date Purchased| Date Ended| Package|
|2019-1-1 | 2019-2-1 | 1Month |
为此:
|Date Purchased| Date Ended| Package|
|2019-1-1 | 2019-2-1 | 1Month |
|2019-1-8 | 2019-2-1 | 1Month |
|2019-1-15 | 2019-2-1 | 1Month |
|2019-1-23 | 2019-2-1 | 1Month |
关于如何在SQL中执行此操作的任何想法?谢谢
您可以使用GENERATE_DATE_ARRAY()
和UNNEST()
:
SELECT dte, t.ended, t.package
FROM (select t,
GENERATE_DATE_ARRAY(t.purchased, t.ended, interval 1 week) as dtes
from (select date('2019-01-01') as purchased, date('2019-02-01') as ended, '1MOnth' as package
) t
) t CROSS JOIN
UNNEST(t.dtes) dte
我相信您的要求可以使两个日期之间的所有星期都恢复。试试这个链接:
how to get the start and end dates of all weeks between two dates in SQL server?
下面是BigQuery标准SQL的内容>>
#standardSQL SELECT * EXCEPT(day) REPLACE(day AS date_purchased) FROM `project.dataset.table`, UNNEST(( SELECT CASE package WHEN 'Week' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 DAY) WHEN 'Month' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 WEEK) WHEN 'Quarter' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 MONTH) WHEN 'Year' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 QUARTER) ELSE GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 MONTH) END )) day
您可以像下面的示例一样使用虚拟数据进行测试,播放以上内容>
#standardSQL WITH `project.dataset.table` AS ( SELECT DATE '2019-01-01' date_purchased, DATE '2019-02-01' date_ended, 'Month' package UNION ALL SELECT '2019-01-01', '2019-03-31', 'Quarter' UNION ALL SELECT '2019-01-01', '2020-12-31', 'Year' ) SELECT * EXCEPT(day) REPLACE(day AS date_purchased) FROM `project.dataset.table`, UNNEST(( SELECT CASE package WHEN 'Week' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 DAY) WHEN 'Month' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 WEEK) WHEN 'Quarter' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 MONTH) WHEN 'Year' THEN GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 QUARTER) ELSE GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 MONTH) END )) day
有结果
Row date_purchased date_ended package 1 2019-01-01 2019-02-01 Month 2 2019-01-08 2019-02-01 Month 3 2019-01-15 2019-02-01 Month 4 2019-01-22 2019-02-01 Month 5 2019-01-29 2019-02-01 Month 6 2019-01-01 2019-03-31 Quarter 7 2019-02-01 2019-03-31 Quarter 8 2019-03-01 2019-03-31 Quarter 9 2019-01-01 2020-12-31 Year 10 2019-04-01 2020-12-31 Year 11 2019-07-01 2020-12-31 Year 12 2019-10-01 2020-12-31 Year 13 2020-01-01 2020-12-31 Year 14 2020-04-01 2020-12-31 Year 15 2020-07-01 2020-12-31 Year 16 2020-10-01 2020-12-31 Year