根据值和键填充 SQL 中的行

Posted

技术标签:

【中文标题】根据值和键填充 SQL 中的行【英文标题】:Populate rows in SQL based on a value and a key 【发布时间】: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

谢谢

【问题讨论】:

【参考方案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

【讨论】:

以上是关于根据值和键填充 SQL 中的行的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列中的行自动填充第二列中的数据

用以前的值填充日历表中的行

动态填充pyspark数据框中列中的行

SQL Server触发器根据上面的文件名和值填充Null值

SQL 查询返回填充了最多列的行

根据 SQL 中的另一列填充列