如何解决具有线性插值和分组依据的 SQL 查询
我在 AWS 上有一个数据湖,使用 Athena 查询,具有以下结构和示例数据
Key | Date | Value
----+---------------+-------
a | 01/01/2020 | 4.5
a | 05/01/2020 | 6
a | 06/01/2020 | 3.2
b | 01/01/2020 | 2.4
b | 03/01/2020 | 5
我想运行查询以提取特定 values
和每个 date
的 key
。如果日期不是已知的,比如在 99% 的情况下,值应该作为两个最接近的一个的线性插值返回。
Dates
在此处以 dd/mm/YYYY 格式报告,但在数据湖中存储为时间戳。
结果示例
如果我想获得 1 月 2 日 (02/01/2020) 的 values
,预期输出为
Key | Date | Value
----+---------------+-------
a | 02/01/2020 | 4.875
b | 02/01/2020 | 3.70
其中 4.875 是 4.5(01/01/2020 的值)和 6(05/01/2020 的值)之间的线性插值。我已手动将其评估为 (y - 4.5) / (2 - 1) = (6 - 4.5) / (5 - 1)
(有关更多参考,请参阅 linear interpolation)。
3.7 相同
我如何通过一个查询来实现(如果可能)?
假设:从我们搜索的时间点开始,我们总是有一个越来越小的日期。
更新 - 基于 PrestoDB 的 Athena 不支持 JOIN LATERAL
,所以我不能考虑这个选项
解决方法
这可能是横向连接的好地方:
select d.dt,case
when n.date = p.date then p.value
else p.value + (n.value - p.value) / datediff('day',n.date,p.date)
end as new_value
from (select date '2020-04-01') d(date)
cross join lateral (
select t.* from mytable t where t.date <= d.date order by t.date desc limit 1
) p -- "previous" value
cross join lateral (
select t.* from mytable t where t.date >= d.date order by t.date limit 1
) n -- "next" value
我们可以在没有横向连接的情况下编写查询:
select date '2020-04-01' as dt,p.k,p.date)
end as new_value
from (
select t.*,row_number() over(partition by k order by date desc) as rn
from mytable t
where date <= '2020-04-01'
) p
inner join (
select t.*,row_number() over(partition by k order by date) as rn
from mytable t
where date >= '2020-04-01'
) n on n.k = p.k
where p.rn = 1 and n.rn = 1
这也概括了查询,因此它可以一次处理多个键(key
是语言关键字,我用 k
代替)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。