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

时间:2014-02-25 12:28:28

标签: sql hadoop hive

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

SESSION是:对于userid,如果有多行,则检查时间戳。如果时间戳差异小于30 ,请将其视为一个会话。

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

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

  1. 因此,对于用户ID 1和

  2. ,有2个会话
  3. 用户ID 2和

  4. 共有1个会话

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

1 个答案:

答案 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添加到第一个表格中,然后创建Q1Q2,然后我加入Q1 }和Q2Q1.RN = Q2.RN - 1上,我们得到当前 timestampQ1.timestamp下一个 {{1} } timestamp,只需更改Q2.timestamp函数,此查询就适用于每种RDBMS