sql - PGSQL:查询设备上当前登录的用户
问题描述
给定一个这样的数据库表:
用户身份 | 设备编号 | 使用权 | ts |
---|---|---|---|
6 | 200 | 登录 | 2021-08-17 05:40:57 |
2 | 100 | 登录 | 2021-08-17 05:41:57 |
2 | 100 | 登录 | 2021-08-17 05:42:57 |
4 | 100 | 登录 | 2021-08-17 05:43:57 |
4 | 100 | 登录 | 2021-08-17 05:44:57 |
4 | 100 | 登出 | 2021-08-17 05:45:57 |
5 | 100 | 登录 | 2021-08-17 05:46:57 |
5 | 100 | 登出 | 2021-08-17 05:47:57 |
6 | 100 | 登录 | 2021-08-17 05:48:57 |
我想找出设备=100 上所有当前登录的用户。登录用户的定义:没有比前一个登录事件的时间戳更大的注销事件。用户可以有多个后续登录事件,但一个最近的注销事件将认为该用户已注销。
预期返回的行:
用户身份 | 设备编号 | 使用权 | ts |
---|---|---|---|
2 | 100 | 登录 | 2021-08-17 05:42:57 |
6 | 100 | 登录 | 2021-08-17 05:48:57 |
从上面的数据集中,我希望得到 user_id(s) 2 和 6;所有其他用户都已注销。
查询此聚合数据的最有效方法是什么?谢谢
使用 PostgreSQL 13
解决方案
您可以找到每个用户的最后访问权限,然后过滤最后访问权限等于“登录”的用户:
WITH last_access AS (SELECT DISTINCT ON (user_id) *
FROM t
WHERE device_id = 100
ORDER BY user_id, ts DESC)
SELECT *
FROM last_access
WHERE access = 'login';
推荐阅读
- css - 将 svg 图像更改为导航栏中的文本。引导程序
- svg - 如何重新计算(而不仅仅是缩放/变换)SVG路径以适应边界框?
- php - Laravel 验证数字
- javascript - 如何在 puppeteer 中获取 div 中的文本
- r - 错误预测自动绘图:强制不是从色彩空间导出的对象
- macos - 使用 pip3 在 Mac 上安装 importlib 时出现问题
- java - 如果时差以秒为单位,则日期格式化程序不反映正确的字符串
- xslt - 通过 XPath 提取元素节点的值?
- python-3.x - 如何在 ConfigArgParse 中进行多行列表?
- lodash - 使用 lodash 查找嵌套对象