Получить IN и OUT даты из таблицы бронирования

Например, у меня есть такая таблица

----------------------------------------------------------------------
|      ID      |     USER    |   READER    |         DATETIME        |
----------------------------------------------------------------------
|       1      |      1      |   READER1   | 2020-01-14 08:12:43.000 |
|       1      |      1      |   READER2   | 2020-01-14 08:13:12.000 |
|       1      |      1      |   READER2   | 2020-01-14 10:12:19.000 |
|       1      |      1      |   READER1   | 2020-01-14 10:13:23.000 |
|       1      |      1      |   READER1   | 2020-01-14 10:30:43.000 |
|       1      |      1      |   READER1   | 2020-01-14 11:30:43.000 |
----------------------------------------------------------------------

Я хочу получить дату входа и выхода пользователя на читателя

Пример :

-------------------------------------------------------------------------------------
|    USER    |    READER    |             IN            |             OUT           |
-------------------------------------------------------------------------------------
|      1     |    READER1   |  2020-01-14 08:12:43.000  |  2020-01-14 10:13:23.000  |
|      1     |    READER2   |  2020-01-14 08:13:12.000  |  2020-01-14 10:12:19.000  |
|      1     |    READER1   |  2020-01-14 10:30:43.000  |  2020-01-14 11:30:43.000  |
-------------------------------------------------------------------------------------

Как я мог получить этот результат?

Всего 1 ответ


Я понимаю, что вы хотите сгруппировать каждые две записи одного и того же пользователя / читателя. Вы можете использовать row_number() и lead() для этого:

select usr, reader, datetime [in], lead_datetime [out]
from (
    select 
        t.*,
        row_number() over(partition by usr, reader order by datetime) rn,
        lead(datetime) over(partition by usr, reader order by datetime) lead_datetime
    from mytable t
) t
where rn % 2 = 1
order by [in]

Демо на БД Fiddle :

usr | reader  | in                  | out                
--: | :------ | :------------------ | :------------------
  1 | READER1 | 2020-01-14 08:12:43 | 2020-01-14 10:13:23
  1 | READER2 | 2020-01-14 08:13:12 | 2020-01-14 10:12:19
  1 | READER1 | 2020-01-14 10:30:43 | 2020-01-14 11:30:43

Есть идеи?

10000