【问题标题】:Overlapping Concurrent Sessions PSQL for each hour每小时重叠并发会话 PSQL
【发布时间】:2021-11-09 10:06:29
【问题描述】:

一段时间以来,我一直在努力寻找合适的解决方案。我有一个名为 sessions 的表。

该表有 3 个字段:

  • session_id - 代表用户会话的唯一标识
  • timestamp - 用户进行操作的时间
  • 操作 - 登录或注销

...

我会跟踪用户何时登录和退出。

session_id action timestamp
1 login 2021-11-09 10:03
2 login 2021-11-09 10:15
1 logout 2021-11-09 10:48
3 login 2021-11-09 11:03
4 login 2021-11-09 11:43
5 login 2021-11-09 14:14
5 logout 2021-11-09 15:03
3 logout 2021-11-09 15:08
4 logout 2021-11-09 16:03
2 logout 2021-11-09 17:01

基本上,我想要一个输出表,它可以显示每小时有多少并发会话:

timestamp concurrent_sessions
2021-11-09 10:00 2
2021-11-09 11:00 3
2021-11-09 12:00 3
2021-11-09 13:00 3
2021-11-09 14:00 4
2021-11-09 15:00 4
2021-11-09 16:00 2
2021-11-09 17:00 1

【问题讨论】:

    标签: postgresql overlapping


    【解决方案1】:

    首先,创建一个时间戳范围表,然后加入一个时间戳表,聚合和计数:

    SELECT times.t, count(*)
    FROM generate_series(
            TIMESTAMP '2021-11-09 10:00:00',
            TIMESTAMP '2021-11-09 17:00:00',
            INTERVAL '1 hour'
         ) AS times(t)
       LEFT JOIN (SELECT session_id,
                         tsrange(li.timestamp, lo.timestamp, '[]') AS range
                  FROM mytable AS li
                     LEFT JOIN mytable AS lo USING (session_id)
                  WHERE li.action = 'login'
                    AND lo.action = 'logout'
                 ) AS q
          ON q.range @> times.t
    GROUP BY times.t;
    ORDER BY times.t
    

    【讨论】:

    • 这是正确的。请编辑答案并使用正确的名称tsrange 而不是tzrange,以便我可以接受正确的答案。感谢您的帮助!
    • 感谢您发现并修正我的错字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2021-06-18
    • 2014-07-31
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多