sql - 如何从 Oracle 中的单个列中获取 IN / OUT 小时
问题描述
我在 Oracle 中有一个 REGISTER 表,看起来像这样
| ID | BOOOK_ID | CLIENT_ID | TYPE | DATE |
| 1 | 2447 | 274761 | 1 | 2020-04-07 09:38:54 |
| 2 | 2447 | 274761 | 2 | 2020-04-07 09:39:25 |
| 3 | 2447 | 274761 | 1 | 2020-04-07 09:39:53 |
| 4 | 2447 | 274761 | 2 | 2020-04-07 09:41:03 |
| 5 | 1000 | 274761 | 1 | 2020-04-07 09:52:05 |
| 6 | 2447 | 274761 | 1 | 2020-04-07 10:04:54 |
| 7 | 1000 | 274761 | 2 | 2020-04-07 10:05:38 |
| 8 | 2447 | 274761 | 2 | 2020-04-07 10:06:04 |
| 9 | 3002 | 274761 | 1 | 2020-04-07 11:22:02 |
我想要的结果是这样的
| ID | BOOOK_ID | IN | OUT |
| 1 | 2447 | 2020-04-07 09:38:54 | 2020-04-07 09:39:25 |
| 2 | 2447 | 2020-04-07 09:39:53 | 2020-04-07 09:41:03 |
| 3 | 1000 | 2020-04-07 09:52:05 | 2020-04-07 10:05:38 |
| 4 | 2447 | 2020-04-07 10:04:54 | 2020-04-07 10:06:04 |
| 5 | 3002 | 2020-04-07 11:22:02 | |
其中 type = 1 表示开始日期,type = 2 表示结束日期。
解决方案
您可以使用窗口函数。如果我们假设类型在您的示例数据中正确交错:
select rownum as id, book_id, client_id, date as in_date, out_date
from (select t.*,
lead(date) over (partition by book_id, client_id order by date) as out_date
from t
) t
where type = 1;
这是一个 db<>fiddle。
如果数据没有正确交错,您应该提出一个新问题,并附上可能出现问题的良好示例以及您希望最终结果的样子。这回答了您在这里提出的问题。
推荐阅读
- java - java.lang.NullPointerException:使用 firebase 时
- javascript - 如何使用噩梦点击此链接?
- mysql - UNIX_TIMESTAMP 字段分区一整年
- ios - 奇怪的自动布局问题
- r - 在计算的 data.table 中创建新列,名称存储在另一个字符变量中
- angular - Angular 5:无法读取未定义的属性“USERID”
- jquery - 如何在不显示的情况下将字符串添加到字段输入?
- ionic-framework - 使用 Adobe Analytics 构建 Ionic
- javascript - 将coinmarketcap api v2与谷歌表格一起使用-通过多次调用添加到js对象
- javascript - 在这种情况下,$('id').on('click', this.method.bind(this)) 究竟做了什么?