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

标签 sql hadoop hive

我有以下表格数据结构。 我需要找到 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 。

  1. 因此用户id 1 和

  2. 有2 个 session
  3. 用户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 添加到第一个表,然后创建 Q1Q2 然后我在 Q1.RN = Q2.RN - 1 上加入 Q1Q2,我们得到了 current timestamp as Q1.timestampnext timestamp as Q2.timestamp,并且此查询适用于各种 RDBMS,只需更改 ROW Number 函数即可。

关于SQL获取时间戳差大于30时id的个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014240/

相关文章:

sql - 提高 PostgresQL 聚合查询性能

MySQL查询从多个表中选择并插入到一个表中

php - 如何在orders、ordersDetails模式中保存、处理订单总金额?

java - 如何从 java 程序启动 Hadoop、Accumulo 和 ZooKeeper?

hadoop - 从另一个包含空值的表中向表中插入数据,并将空值替换为原始表 1 的值

hadoop - 记录对于内存缓冲区来说太大。通过 TEZ 使用 Hive 的 ORC 表时出错

python - ARRAY_CONTAINS pyspark 中的多个值

php - 使用 OR Case 选择数据,但仍然得到错误的结果

hadoop - 我可以在不设置mapred.reduce.tasks=1的情况下在mapreduce程序中找到min、max或avg吗

logging - Hadoop 将 YARN 应用程序的日志存储在哪里?