【问题标题】:How to achieve multiple records output with based on single record如何实现基于单条记录的多条记录输出
【发布时间】:2019-03-13 23:17:21
【问题描述】:

我有一个“经理”表,其中包含如下数据

我期待如下输出

或我期望的另一种输出格式是

条件是 经理 1001 于 2018 年加入,结束日期为 9999,因此他在 2018 年、2019 年和 2020 年活跃

经理1004于2018年加入,同年离开公司,所以只在2018年活跃

请帮助我如何实现这一目标

【问题讨论】:

  • 为什么要在单独的行中使用它?想要的结果没有任何意义。
  • 是的,我希望它们在单独的行中,这就是我面临的问题,如果我得到第二个输出格式也可以

标签: sql google-bigquery


【解决方案1】:

用它建立一个年份列表和JOIN

SELECT manager_id, yearnum, 'Active' AS status
FROM UNNEST(GENERATE_ARRAY(2018, 2020)) AS yearnum
JOIN managers ON yearnum BETWEEN EXTRACT(year FROM eff_start_date)
                             AND EXTRACT(year FROM eff_end_date)

【讨论】:

    【解决方案2】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    WITH years AS (
      SELECT EXTRACT(YEAR FROM year) year 
      FROM ( SELECT 
        (SELECT MIN(eff_start_date) FROM `project.dataset.managers`) AS min_date, 
        (SELECT MAX(eff_end_date) FROM `project.dataset.managers` WHERE eff_end_date != '9999-12-31') max_date  
      ), UNNEST(GENERATE_DATE_ARRAY(DATE_TRUNC(min_date, YEAR), DATE_TRUNC(max_date, YEAR), INTERVAL 1 YEAR)) year
    ), managers_list AS (
      SELECT manager_id, status, EXTRACT(YEAR FROM eff_start_date) start_year, EXTRACT(YEAR FROM eff_end_date) end_year
      FROM `project.dataset.managers`
    )
    SELECT manager_id, year, status 
    FROM years y, managers_list m
    WHERE year BETWEEN start_year AND end_year 
    

    您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示

    #standardSQL
    WITH `project.dataset.managers` AS (
      SELECT 1001 manager_id, 'Active' status, DATE '2018-02-10' eff_start_date, DATE '9999-12-31' eff_end_date UNION ALL
      SELECT 1002, 'Active', '2018-02-14', '2020-12-31' UNION ALL
      SELECT 1003, 'Active', '2018-02-16', '2019-02-15' UNION ALL
      SELECT 1004, 'Active', '2018-02-16', '2018-12-31' 
    ), years AS (
      SELECT EXTRACT(YEAR FROM year) year 
      FROM ( SELECT 
        (SELECT MIN(eff_start_date) FROM `project.dataset.managers`) AS min_date, 
        (SELECT MAX(eff_end_date) FROM `project.dataset.managers` WHERE eff_end_date != '9999-12-31') max_date  
      ), UNNEST(GENERATE_DATE_ARRAY(DATE_TRUNC(min_date, YEAR), DATE_TRUNC(max_date, YEAR), INTERVAL 1 YEAR)) year
    ), managers_list AS (
      SELECT manager_id, status, EXTRACT(YEAR FROM eff_start_date) start_year, EXTRACT(YEAR FROM eff_end_date) end_year
      FROM `project.dataset.managers`
    )
    SELECT manager_id, year, status 
    FROM years y, managers_list m
    WHERE year BETWEEN start_year AND end_year 
    -- ORDER BY manager_id, year   
    

    结果

    Row manager_id  year    status   
    1   1001        2018    Active   
    2   1001        2019    Active   
    3   1001        2020    Active   
    4   1002        2018    Active   
    5   1002        2019    Active   
    6   1002        2020    Active   
    7   1003        2018    Active   
    8   1003        2019    Active   
    9   1004        2018    Active     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多