SQL 获取时间戳差异大于 30 时的 id 计数

Posted

技术标签:

【中文标题】SQL 获取时间戳差异大于 30 时的 id 计数【英文标题】:SQL get the count of ids when timestamp difference is greater than 30 【发布时间】:2014-02-25 12:28:27 【问题描述】:

我有这个下表数据结构。 我需要找到 SESSIONS 的数量。

SESSION is :对于用户 ID,如果存在多行,则检查时间戳。如果时间戳差异小于 30,则考虑为一个会话。

+---------+----------+
|userid   | timestamp|
+---------+----------+
|  1      | 10       |
|  1      | 11       |
|  1      | 55       |
|  2      | 65       |
+---------+----------+

在上面的示例中,对于 userid 1,时间戳 10 和 11 被视为单个会话。但是 (55-11 = 44) 大于 30。所以,这是另一个会话。

    所以用户 ID 1 和

    有 2 个会话

    用户 ID 2 和 1 个会话

总共有 2+1= 3 个会话。我只需要获取这个计数。如何做到这一点?

【问题讨论】:

您想在 Hive 还是 mysql 中获得答案? 我想要它用于蜂巢。我猜基本的想法是一样的?标记 mySql 以获得一般的 SQL 思路 与其他版本的 SQL 相比,Hive 非常有限。例如,它在from 子句中不提供子查询,并且有其他限制。 我的朋友,这里有个问题,当userid1 你必须做这样的事情55 - 11 = 44,如果你做55 - 10 是否可能,我的意思是做max(timestamp) - min(timestamp) @Hamidreza :不,不能做 MAX-MIN,因为我正在跟踪连续性。 【参考方案1】:

这个查询工作正常:

SELECT COUNT(FINAL_TAB.userid) + SUM(FINAL_TAB.FIN) FINAL_RESULT FROM
(SELECT TAB2.userid,SUM(CNT) FIN FROM
(SELECT TAB1.userid,CASE WHEN HA > 30 THEN 1 ELSE 0 END CNT FROM
(SELECT Q1.userid,CASE WHEN Q1.userid = Q2.userid THEN Q2.timestamp - Q1.timestamp 
ELSE 0 END HA FROM 
(SELECT @v1 := @v1 + 1 RN,TABLE1.* FROM TABLE1 JOIN(SELECT @v1 := 0)V1)Q1
LEFT OUTER JOIN
(SELECT @v2 := @v2 + 1 RN,TABLE1.* FROM TABLE1 JOIN(SELECT @v2 := 0)V2)Q2
ON Q1.RN = Q2.RN - 1)TAB1)TAB2 GROUP BY TAB2.userid)FINAL_TAB;

ORACLEMS SQL ServerMYSQLPostgreSQL

这个查询中最重要的是我将row number 作为RN 添加到第一个表中,然后创建Q1Q2 然后我在Q1.RN = Q2.RN - 1 上加入Q1Q2,在那里我们得到了 current timestamp as Q1.timestampnext timestamp as Q2.timestamp,并且这个查询适用于各种RDBMS 只是改变ROW Number 函数。

【讨论】:

以上是关于SQL 获取时间戳差异大于 30 时的 id 计数的主要内容,如果未能解决你的问题,请参考以下文章

在 Impala SQL 中获取时间戳行的差异,每次都会更新差异条件

查找计数差异 - Microsoft Access 和 SQL

Oracle - 计算时间戳之间的差异大于 1 小时的时间戳

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?

SQL按时间戳间隔获取平均值

在 SQL 中获取两个计数的差异