如何根据条件(SQL)从1条记录中创建更多记录

问题描述 投票:0回答:2

我正在尝试根据某些条件从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中执行此操作的任何想法?谢谢

sql google-bigquery union
2个回答
0
投票

您可以使用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

0
投票

我相信您的要求可以使两个日期之间的所有星期都恢复。试试这个链接:

how to get the start and end dates of all weeks between two dates in SQL server?


0
投票

下面是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     
© www.soinside.com 2019 - 2024. All rights reserved.