Oracle
 sql >> база данни >  >> RDS >> Oracle

Обединете две таблици въз основа на времето

Разбирам вашето запитване като някакъв проблем с пропуски и острови.

Бих го решил чрез union и двете таблици, след което се прави сумиране на прозореца, за да се идентифицират групите:всеки път, когато се срещне влизане, започва нова група. Последната стъпка е агрегиране по групи.

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

Демо на DB Fiddle :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA 01400 и ORA 02296:Не може да се вмъкне нула или да се променят свойствата на добавената колона на NOT NULL

  2. Oracle Regexp се проваля в SQL

  3. използвайте LIKE и IN с подзаявка в sql

  4. Актуализирайте колоната със стойности от друга колона

  5. Извикайте съхранена процедура от sqlplus