我有以下表数据结构。 我需要找到SESSIONS的数量。
SESSION是:对于userid,如果有多行,则检查时间戳。如果时间戳差异小于30 ,请将其视为一个会话。
+---------+----------+
|userid | timestamp|
+---------+----------+
| 1 | 10 |
| 1 | 11 |
| 1 | 55 |
| 2 | 65 |
+---------+----------+
在上面的示例中,对于 用户ID 1 ,时间戳10和11被视为单个会话。但(55-11 = 44)大于30 。所以,这是另一场会议。
因此,对于用户ID 1和
用户ID 2和
总体上有2 + 1 = 3个会话。我只需要获取此计数。如何做到这一点?
答案 0 :(得分: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;
<强> ORACLE
MS SQL Server
MYSQL
PostgreSQL 强>
此查询中最重要的一点是,我将row number
RN
添加到第一个表格中,然后创建Q1
和Q2
,然后我加入Q1
}和Q2
在Q1.RN = Q2.RN - 1
上,我们得到当前 timestamp
为Q1.timestamp
和下一个 {{1} } timestamp
,只需更改Q2.timestamp
函数,此查询就适用于每种RDBMS
。