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 中的某一行中的某个值过滤列

SQL (Hive):在使用 GROUP BY 进行聚合时使用窗口函数

删除 Presto SQL 兼容数据库 (AWS Athena) 中数据中的双引号?