【问题标题】:SQL Find all events that occurred within 1 day of each otherSQL 查找在 1 天内发生的所有事件
【发布时间】:2016-11-22 14:41:35
【问题描述】:

我在 Hive 中有一个这样的表: dt(时间戳),event_id(字符串)

我正在查找同一会话中(例如)一天内发生的所有事件。假设一个会话可以跨越多天。

   session         dt                    event_id
       1      2016-06-10 00:07:33     u38443jdnksdjoeoewk
       2      2016-06-11 11:11:41     u39839jdijewenkfjij
       1      2016-06-15 13:07:42     u38443jdjdksdnlqpma
       2      2016-06-12 05:08:07     u38443jmcmsdjwewekh

在这种情况下,结果集将是

2016-06-11 11:11:41     u39839jdijewenkfjij
2016-06-12 05:08:07     u38443jmcmsdjwewekh

因为其他行的时间戳超过了一天。这看起来可以通过自加入来实现,但这将非常昂贵。有没有更好的办法?

【问题讨论】:

    标签: sql join hive


    【解决方案1】:

    使用laglead 获取上一行和下一行的日期,然后用当前行的日期减去它。检查其中任何一个是否在当前行日期的一天内。

    select session,dt,event_id 
    from (
    select dt,event_id,session,
    unix_timestamp(dt)-unix_timestamp(lag(dt) over(partition by session order by dt)) prev_diff,
    unix_timestamp(lead(dt) over(partition by session order by dt))-unix_timestamp(dt) next_diff
    from t
    ) x
    where prev_diff <= 86400 or next_diff <= 86400
    

    【讨论】:

    • 抱歉@vkp,之前的架构有错误。更新了问题 - 本质上,寻找具有相同会话 ID 的行
    • @Craig ..查看编辑。唯一需要的更改是按会话分区。
    • @vkp 我不确定这是否有效,因为在当前记录的一小时内可能有很多记录。此外,它们可能不是按时间顺序排列的。 Best case、lag 和 lead 会为您提供当前记录 1 小时内的许多可能记录中的 2 个。
    【解决方案2】:

    在任何给定事件的一天内获取所有事件的最佳方法是使用自我加入。从计算上讲,它不会那么昂贵。我在一个有 7000 条记录的表上对其进行了测试,当匹配正负 60 分钟时,它需要 3 秒并返回 176,588 个结果。我使用 DATEDIFF 进行比较,或者您可以使用 DATEADD 并与两个限制进行比较。以下是使用您的表格的两个示例:

    SELECT h1.session, h1.event_id, h2.session, h2.event_id, h1.dt, h2.dt
    FROM Hive h1
        JOIN Hive h2 ON DATEDIFF(hh, h1.dt, h2.dt) < 24
    
    
    SELECT h1.session, h1.event_id, h2.session, h2.event_id, h1.dt, h2.dt
    FROM Hive h1
        JOIN Hive h2 ON DATEADD(d,1,h1.dt) >= h2.dt
            AND DATEADD(d,-1,h1.dt) <= h2.dt
    

    【讨论】:

    • 您能分享一下您使用的查询吗?
    • @Craig 我添加了两个查询。我会测试两者,我认为根据您的情况,如果 dt 列有索引,第二个选项可能会更快。在测试中,第二个选项速度较慢。
    • 这里不考虑日期排序,需要在DATEDIFF(...)周围使用ABS()
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多