【问题标题】:How to get timespans between entities from timed log table?如何从定时日志表中获取实体之间的时间跨度?
【发布时间】:2019-08-21 06:12:56
【问题描述】:

我有一个日志表来存储用户的登录/注销日志。我的目标是计算每个用户登录的次数和每次登录的登录时间。

我正在研究 PostgreSQL 数据库。日志表有log_id(PK)、user_id(FK)、login_state、created_time。 login_state 列是枚举类型,其值为“登录”或“注销”。

目前,我在 Log 表上使用了自联接,如下所示。

SELECT A.log_id, A.user_id, A.login_state, A.created_time, B.log_id, B.login_state, B.created_time, (B.created_time-A.created_time) elapsedtime 
FROM logtable A INNER JOIN logtable B ON (A.login_state='login' AND B.login_state='logout') 
WHERE (A.user_id=B.user_id) AND (A.created_time<=B.created_time);

我得到了一些正确的记录,但也有错误的记录。

我认为加入可能不是一个解决方案。对于每个登录实体,应该只匹配一个注销实体,但我无法为此编写正确的查询语句。

最好的结果可能是登录-注销对的集合以及每个用户的经过时间。

需要一些帮助。谢谢。

==============添加一些样本数据和预期结果=========

示例日志表

预期结果

用于测试的 DB Fiddler https://www.db-fiddle.com/f/vz6EyKKTg6PWs1X4HbTspB/0

【问题讨论】:

  • 请添加示例数据和预期输出。
  • @S-Man 好的,我添加了一些图像。预期结果是模拟图像。
  • 请不要添加图片。我们无法复制数据进行测试。请添加可复制的代码或像这样的小提琴dbfiddle.uk/…
  • @S-Man 添加了! https://www.db-fiddle.com/f/vz6EyKKTg6PWs1X4HbTspB/0 请注意用户表被重命名为 myuser 表。

标签: sql postgresql


【解决方案1】:

demo:db<>fiddle

您可以使用lead() window function 将下一个值放入当前记录。

SELECT 
    *,
    logout_time - created_time AS elapsed_time
FROM (
    SELECT
        *,
        lead(created_time) OVER (PARTITION BY user_id ORDER BY created_time) as logout_time
    FROM logtable
) s
WHERE login_state = 'login'
ORDER BY created_time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多