【问题标题】:Populate rows in SQL based on a value and a key根据值和键填充 SQL 中的行
【发布时间】:2020-04-01 08:43:50
【问题描述】:

当前数据集 - 具有日期、ID 和值

ID | Value | Date 
--------------------
X  | 1.1       |  2020/01/14
X  | 2.1       |  2020/01/15
Y  | 0.9       |  2020/01/11
X  | 3.2       |  2020/01/18
Y  | 2.4       |  2020/01/14

`预期结果 - 寻找标准 SQL 脚本来帮助我填充缺失的日期并携带/滚动/复制给定 ID 的 ID 和值。 (最好是 Bigquery 或 Spark SQL)

预期结果

   ID | Value | Date 
   --------------------
  X  | 1.1       |  2020/01/14
  X  | 2.1       |  2020/01/15
  X  | 2.1       |  2020/01/16
  X  | 2.1       |  2020/01/17
  X  | 3.2       |  2020/01/18
  Y  | 0.9       |  2020/01/11
  Y  | 0.9       |  2020/01/12
  Y  | 0.9       |  2020/01/13
  Y  | 2.4       |  2020/01/14

谢谢

【问题讨论】:

    标签: sql apache-spark-sql google-bigquery window-functions


    【解决方案1】:

    在 BigQuery 中,您可以使用 generate_date_array() 和聚合来获取行:

    select i.id, the_date, t.value
    from (select id, min(date) as min_date, max(date) as max_date
          from t
          group by id
         ) i cross join
         unnest(generate_date_array(min_date, max_date)) the_date left join
         t
         on t.id = i.id and g.date = the_date;
    

    您可以通过多种方式填写这些值。您的数据似乎在增加,因此可以使用累积最大值:

    select i.id, the_date,
           max(t.value) over (partition by i.id order by the_date) as value
    from (select id, min(date) as min_date, max(date) as max_date
          from t
          group by id
         ) i cross join
         unnest(generate_date_array(min_date, max_date)) the_date left join
         t
         on t.id = i.id and g.date = the_date;
    

    或者,您可以使用:

    coalesce(value,
             last_value(value ignore nulls) over (partition by i.id order by thedate)
            ) as value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      相关资源
      最近更新 更多