【问题标题】:SQL get the count of ids when timestamp difference is greater than 30SQL 获取时间戳差异大于 30 时的 id 计数
【发布时间】: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。所以,这是另一个会话。

  1. 所以用户 ID 1 和

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

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

【问题讨论】:

  • 您想在 Hive 还是 MySQL 中获得答案?
  • 我想要它用于蜂巢。我猜基本的想法是一样的?标记 mySql 以获得一般的 SQL 思路
  • 与其他版本的 SQL 相比,Hive 非常有限。例如,它在from 子句中不提供子查询,并且有其他限制。
  • 我的朋友,这里有个问题,当userid1 你必须做这样的事情55 - 11 = 44,如果你做55 - 10 是否可能,我的意思是做max(timestamp) - min(timestamp)
  • @Hamidreza :不,不能做 MAX-MIN,因为我正在跟踪连续性。

标签: sql hadoop hive


【解决方案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.RN = Q2.RN - 1 上加入Q1Q2,在那里我们得到了 current timestamp as Q1.timestampnext timestamp as Q2.timestamp,并且这个查询适用于各种RDBMS 只是改变ROW Number 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2019-04-20
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多