如何从定时日志表中获取实体之间的时间跨度?
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
【讨论】:
以上是关于如何从定时日志表中获取实体之间的时间跨度?的主要内容,如果未能解决你的问题,请参考以下文章