gpt4 book ai didi

具有线性插值和分组依据的 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 15:09:57 24 4
gpt4 key购买 nike

我在 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 格式报告,但在数据湖中存储为时间戳。
结果示例
如果我想得到 values对于 1 月 2 日 (02/01/2020),预期输出为
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,
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 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 代替)。

关于具有线性插值和分组依据的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65375902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com