根据值和键填充 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 中的行的主要内容,如果未能解决你的问题,请参考以下文章