如何从定时日志表中获取实体之间的时间跨度?

Posted

技术标签:

【中文标题】如何从定时日志表中获取实体之间的时间跨度?【英文标题】: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 表。 【参考方案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

【讨论】:

以上是关于如何从定时日志表中获取实体之间的时间跨度?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 通过 id 从跨度中获取文本/值并将其放入具有 cURL 的外部站点的变量中

如何从硒的跨度中获取文本

iPhone核心数据:如何在NIBS之间传递和获取实体

如何使用类获取跨度内的文本。 (for循环内部)

如何使用 javascript 获取隐藏的跨度值

如何通过 Selenium 和 Python 从 html 标签跨度获取文本