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
子句中不提供子查询,并且有其他限制。
我的朋友,这里有个问题,当userid
是1
你必须做这样的事情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
添加到第一个表中,然后创建Q1
和Q2
然后我在Q1.RN = Q2.RN - 1
上加入Q1
和Q2
,在那里我们得到了 current timestamp
as Q1.timestamp
和 next timestamp
as Q2.timestamp
,并且这个查询适用于各种RDBMS
只是改变ROW Number
函数。
【讨论】:
以上是关于SQL 获取时间戳差异大于 30 时的 id 计数的主要内容,如果未能解决你的问题,请参考以下文章
在 Impala SQL 中获取时间戳行的差异,每次都会更新差异条件
查找计数差异 - Microsoft Access 和 SQL
Oracle - 计算时间戳之间的差异大于 1 小时的时间戳