【问题标题】:Athena (Presto) SQL window functionsAthena (Presto) SQL 窗口函数
【发布时间】: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 的回复不匹配

标签: sql amazon-web-services window-functions amazon-athena presto


【解决方案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) 替换为所需的值。

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2021-02-19
    • 2021-06-16
    • 2020-07-21
    • 1970-01-01
    • 2022-10-04
    • 2020-11-07
    • 2021-03-29
    相关资源
    最近更新 更多