【问题标题】:Flat Big Query Rows扁平大查询行
【发布时间】:2018-11-07 10:19:42
【问题描述】:

请帮我解决这个任务。我有这样的 Google Big Query 表:

| name | startDate  | endDate    |
| Bob  | 2018-01-01 | 2018-01-01 |
| Nick | 2017-12-29 | 2017-12-31 |

因此我需要得到这样的东西:

| name  | date       |
| Bob   | 2018-01-01 |
| Nick  | 2017-12-29 |
| Nick  | 2017-12-30 |
| Nick  | 2017-12-31 |

有可能吗?提前谢谢你。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:
    WITH CTE as (
    SELECT 'bob' name, date('2018-01-01') startDate, date('2018-01-01') endDate
    UNION ALL SELECT 'Nick', date '2017-12-29' startDate, date('2017-12-31') endDate
    ),
    
    CTE2 AS (
    SELECT name, GENERATE_DATE_ARRAY(startDate, endDate, INTERVAL 1 DAY) AS date
    FROM CTE
    )
    
    SELECT name, date
    FROM CTE2,
    UNNEST(date) as date
    

    【讨论】:

      【解决方案2】:

      或者只是简单的

      #standardSQL
      SELECT name, date
      FROM `project.dataset.table`, 
      UNNEST(GENERATE_DATE_ARRAY(startDate, endDate)) date
      

      【讨论】:

        【解决方案3】:

        您可以在这里使用日历表:

        WITH dates AS (
            SELECT '2017-12-29' AS date_val UNION ALL
            SELECT '2017-12-30' UNION ALL
            SELECT '2017-12-31' UNION ALL
            SELECT '2018-01-01'
            -- and maybe other dates
        )
        
        SELECT
            t2.name,
            t1.date_val
        FROM dates t1
        INNER JOIN yourTable t2
            ON t1.date_val BETWEEN t2.startDate AND t2.endDate
        ORDER BY
            t2.name,
            t1.date_val;
        

        如果您的 BigQuery 版本不支持 CTE,您可以将 CTE 作为子查询内联。也就是说,将 dates 替换为 CTE 本身的正文。

        在实践中,您可能想要生成一个日期系列 (q.v. here),或者可能在您的数据库中维护一个专用的日历表。以上只是显示了查询本身的样子。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-08
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多