作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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)。
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/
我是一名优秀的程序员,十分优秀!