我有以下表格数据结构。 我需要找到 SESSIONS 的数量。
SESSION is : 对于一个userid,如果有多行,则检查时间戳。如果时间戳差异小于 30,则将其视为一个 session 。
+---------+----------+
|userid | timestamp|
+---------+----------+
| 1 | 10 |
| 1 | 11 |
| 1 | 55 |
| 2 | 65 |
+---------+----------+
在上面的示例中,对于 userid 1,时间戳 10 和 11 被视为单个 session 。但是 (55-11 = 44) 大于 30。所以,这是另一个 session 。
因此用户id 1 和
有2 个 session
用户ID 2 和有1 个 session
总共有 2+1= 3 个 session 。我只需要获取这个计数。如何实现?
最佳答案
这个查询工作正常:
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;
ORACLE
MS SQL Server
MYSQL
PostgreSQL
此查询中最重要的是我将 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的个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014240/