Athena (Presto) SQL 窗口函数
Posted
技术标签:
【中文标题】Athena (Presto) SQL 窗口函数【英文标题】:Athena (Presto) SQL window functions 【发布时间】:2017-12-17 01:04:53 【问题描述】:假设我在 Athena 中有以下数据:
id ts
uid1 1499672134268
uid1 1499672134292
uid1 1499672136189
uid1 1499672136212
uid1 1499719927907
uid1 1499719927940
uid1 1499719927975
uid1 1499719927999
uid2 1499670000000
uid2 1499670000010
uid2 1499688880010
我想这样排名:
rank id ts
1 uid1 1499672134268
1 uid1 1499672134292
1 uid1 1499672136189
1 uid1 1499672136212
2 uid1 1499719927907
2 uid1 1499719927940
2 uid1 1499719927975
2 uid1 1499719927999
1 uid2 1499670000000
1 uid2 1499670000010
2 uid2 1499688880010
逻辑是:
第二组最小值与第一组最大值之差大于x
我认为dense_rank() OVER (PARTITION BY id ... )
的某种组合可以解决它,但我是 SQL 中窗口函数的新手。
谢谢
【问题讨论】:
在这个例子中x
是什么?如果与之前的 ts > x 的差异,您的意思是重置组吗?
没错,x只是某个阈值
使用数据样本阐明逻辑。您的帖子定义与您对@vkp 的回复不匹配
【参考方案1】:
您可以使用lag
并获得与前一行的ts
的差值,并在大于 x 时使用运行总和将其重置。
select id,ts,1+sum(col) over(partition by id order by ts) as rnk
from (select id,ts
,case when ts-lag(ts,1,ts) over(partition by id order by ts) > 3000 then 1 else 0 end as col
from tbl
) t
将case
表达式中的3000
(x) 替换为所需的值。
【讨论】:
以上是关于Athena (Presto) SQL 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
Presto SQL / Athena:在不同日期的时间之间进行选择
使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制
Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒
根据 SQL 或 Presto Athena 中的某一行中的某个值过滤列