【问题标题】:How can I find the time between users session activity using SQL如何使用 SQL 查找用户会话活动之间的时间
【发布时间】:2017-11-06 01:08:56
【问题描述】:

使用 SQL 如何找到每个用户会话之间的持续时间或经过的时间?例如 user_id 1234 在 2017-01-01 00:00:00 有一个会话,在 2017-01-02 有另一个会话(见下表)。如何找到上一个 session_end 到下一个 session_start 开始之间的时间。

user_id|session_start       |session_end
1234   | 2017-01-01 00:00:00| 2017-01-01 00:30:30
1236   | 2017-01-01 01:00:00| 2017-01-01 01:05:30
1234   | 2017-01-02 12:00:09| 2017-01-02 12:00:30
1234   | 2017-01-01 02:00:00| 2017-01-01 03:30:30
1236   | 2017-01-01 00:00:00| 2017-01-01 00:30:30

谢谢。

【问题讨论】:

  • 您好,请更新您的标签,以便您只有一种数据库类型,是 postgresql、redshift 还是 sql server?请删除不适用的标签。

标签: sql postgresql


【解决方案1】:

这可以使用window functions轻松完成

select user_id, session_start, session_end,
       session_start - lag(session_end) over (partition by user_id order by session_start) as time_diff
from the_table
order by user_id, session_start;

在线示例:http://rextester.com/NTVH38963


从另一个时间戳中减去一个时间戳会返回一个 interval 以将其转换为分钟,您可以通过 extract 获得间隔代表的秒数并将它们除以 60 以获得分钟数:

select user_id, session_start, session_end,
       extract(epoch from 
                 session_start - lag(session_end) over (partition by user_id order by session_start)
               ) / 60 as minutes
from the_table
order by user_id, session_start;

【讨论】:

  • 能否以分钟为单位获取时间?
【解决方案2】:

这是使用子查询的一种方法:

SELECT dT.user_ID
      ,dT.max_session_start
      ,DATEDIFF(minute, (SELECT MAX(session_end)
                           FROM tablename T
                          WHERE T.user_ID = dT.user_ID
                            AND T.session_end < dT.max_session_start)
                      , dT.max_session_start
               ) AS minutes
  FROM (
         SELECT user_ID
               ,MAX(session_start) AS max_session_start
           FROM tablename
        GROUP BY user_ID
       ) AS dT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2020-02-23
    • 2022-01-17
    • 1970-01-01
    • 2011-01-21
    • 2014-05-01
    相关资源
    最近更新 更多