【问题标题】:How to Left Join from an un-nested table?如何从未嵌套的表中左连接?
【发布时间】:2019-12-12 16:20:11
【问题描述】:

我编写了一个代码来根据某些条件从 1 条记录创建更多记录。例如:如果用户购买了包月套餐,则该表将创建每周的记录,直到结束日期。

从这里:

Order ID|Date Purchased| Date Ended| Package|
   001  | 2019-1-1     | 2019-2-1  | 1Month |

到这里:

   Order ID|Date Purchased| Date Ended| Package| Date Weekly
      001  |2019-1-1      | 2019-2-1  | 1Month |  2019-1-1
      001  |2019-1-1      | 2019-2-1  | 1Month |  2019-1-8 
      001  |2019-1-1      | 2019-2-1  | 1Month |  2019-1-15
      001  |2019-1-1      | 2019-2-1  | 1Month |  2019-1-23

问题是如何按订单 ID 执行第二个表与第一个表的左连接?如果我想加入其他记录?例如,订单 ID 002、003 等。在此先感谢 :)

这是我的代码

SELECT
*
FROM 
(
SELECT
*,
DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S', date_purchased)) AS date_purchased, --Transform datetime to time
DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S', date_ended)) AS date_ended
FROM
`database_123`
),UNNEST(GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 WEEK)) AS date_weekly 

【问题讨论】:

    标签: sql google-bigquery left-join unnest


    【解决方案1】:

    如果我理解正确你的帖子

    SELECT
    *
    FROM 
    (
        SELECT
        *,
        DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S', date_purchased)) AS date_purchased, --Transform datetime to time
        DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S', date_ended)) AS date_ended
        FROM
        `database_123`
    ),UNNEST(GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 WEEK)) AS date_weekly 
    LEFT JOIN your_first_table ft on date_weekly.orderId = ft.orederId
    

    【讨论】:

      【解决方案2】:

      您可能会考虑使用CROSS JOIN 函数来合并两个表中的记录,以将UNNEST() 中设置的行中的每条记录与源表中的单行连接起来。与INNER JOIN 或LEFT JOIN 不同,CROSS JOIN 不会在连接表之间建立关系,但它包含order_id 列值,每个列由GENERATE_DATE_ARRAY 生成。

      例如,根据下面给出的测试数据集:

      WITH
        table_1 AS (
        SELECT
          "001" AS order_id,
          "2019-01-01 00:00:00" AS date_purch,
          "2019-02-01 00:00:00" AS date_end,
          "1Month" AS package
        UNION ALL
        SELECT
          "002" AS order_id,
          "2019-03-01 00:00:00" AS date_purch,
          "2019-05-01 00:00:00" AS date_end,
          "2Months" AS package)
      SELECT
        *
      FROM (
        SELECT
          order_id,
          DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S',
              date_purch)) AS date_purchased,
          DATE(PARSE_DATETIME('%Y-%m-%d %H:%M:%S',
              date_end)) date_ended,
          package
        FROM
          table_1)
      CROSS JOIN
        UNNEST(GENERATE_DATE_ARRAY(date_purchased, date_ended, INTERVAL 1 WEEK)) AS date_weekly
      ORDER BY
        order_id
      

      查找更多示例here。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        相关资源
        最近更新 更多