首页 > 解决方案 > 如何从 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 表示结束日期。

标签: sqloracledatepivot

解决方案


您可以使用窗口函数。如果我们假设类型在您的示例数据中正确交错:

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。

如果数据没有正确交错,您应该提出一个问题,并附上可能出现问题的良好示例以及您希望最终结果的样子。这回答了您在这里提出的问题。


推荐阅读