Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Gabungkan dua tabel berdasarkan waktu

Saya memahami pertanyaan Anda sebagai semacam masalah kesenjangan dan pulau.

Saya akan menyelesaikannya dengan union ing kedua tabel, lalu lakukan penjumlahan jendela untuk mengidentifikasi grup:setiap kali login terpenuhi, grup baru dimulai. Langkah terakhir adalah mengagregasi berdasarkan grup.

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

Demo di 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. Java tidak menjalankan pernyataan persiapan dengan parameter

  2. memilih NLS_LANG untuk Oracle

  3. Oracle DataAccess terkait:Anggota yang dipanggil tidak didukung dalam perakitan dinamis.

  4. Menggunakan kursor ref Oracle di Java tanpa ketergantungan Oracle

  5. python:menghubungkan ke database Oracle menggunakan dompet/tnsnames Oracle