sql - 根据时间合并两个表
问题描述
我是 Oracle SQL 的新手。请通过仅在 Oracle SQL 中给我解决方案来帮助我解决这个问题。
我们有两个表LOGIN和LOGOUT。一个用于登录数据,另一个用于注销数据,如下所述。
登录
LOGIN_TIME ID
19-DEC-19 03.59.33.637000000 AM 1
19-DEC-19 06.58.16.318000000 AM 2
19-DEC-19 10.19.26.039000000 AM 2
19-DEC-19 10.26.03.411000000 AM 2
19-DEC-19 01.35.56.006000000 PM 2
登出
LOGOUT_TIME ID
19-DEC-19 04.34.22.535000000 AM 1
19-DEC-19 07.52.21.568000000 AM 2
19-DEC-19 02.06.13.585000000 PM 2
我想以这样的方式合并这两个表,以便我获得带有各自登录和注销时间的 ID。下面提到了预期的输出。
预期输出
ID LOGIN_TIME LOGOUT_TIME
1 19-DEC-19 03.59.33.637000000 AM 19-DEC-19 04.34.22.535000000 AM
2 19-DEC-19 06.58.16.318000000 AM 19-DEC-19 07.52.21.568000000 AM
2 19-DEC-19 10.19.26.039000000 AM (null)
2 19-DEC-19 10.26.03.411000000 AM (null)
2 19-DEC-19 01.35.56.006000000 PM 19-DEC-19 02.06.13.585000000 PM
提前致谢。
解决方案
我将您的查询理解为某种差距和孤岛问题。
我会通过union
ing 两个表来解决它,然后做一个窗口求和来识别组:每次登录时,一个新的组开始。最后一步是按组聚合。
select
id,
min(case when action = 'in' then dt end) login_time,
max(case when action = 'out' then dt end) logout_time
from (
select
t.*,
sum(case when action = 'in' then 1 else 0 end)
over(partition by id order by dt) grp
from (
select id, login_time dt, 'in' action from login
union all select id, logout_time, 'out' from logout
) t
) t
group by id, grp
order by id, grp
身份证 | 登录时间 | LOGOUT_TIME -: | :-------------------------------- | :-------------------------------- 1 | 19-DEC-19 03.59.33.637000000 上午 | 19 年 12 月 19 日 04.34.22.535000000 上午 2 | 19-DEC-19 06.58.16.318000000 AM | 19-DEC-19 07.52.21.568000000 AM 2 | 19-DEC-19 10.19.26.039000000 上午 | 空 2 | 19-DEC-19 10.26.03.411000000 上午 | 无效的 2 | 19 年 12 月 19 日 01.35.56.006000000 下午 | 19-DEC-19 02.06.13.585000000 下午
推荐阅读
- sql-server - SQL server 中的 Web 服务(替代解决方案)
- java - Spring自定义方法注释不起作用
- python - ask the user to type an integer and then prints "Yes" if that integer is divisible by 3, otherwise prints "No" (Python)
- javascript - 删除需要参数的事件侦听器
- php - Symfony .htaccess - 500 third level domain
- javascript - Cannot copy text from WKWebview to clipboard
- html - 如何使用 HTML 列表框和 SQL 代码显示表格中的某些列?
- python - 如何选择只有正值的列?
- python - 比循环整个文件更好的正则表达式实现?
- spring - 无法使用 jasypt 登录数据库