Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hợp nhất hai bảng và tìm ngày và Khoảng cách trùng lặp

Truy vấn này, sử dụng lead() phân tích Làm công việc. Cột note hiển thị nếu hàng đến từ dữ liệu của bạn hoặc nếu nó bị thiếu khoảng trống:

select id, d1, d2, case dir when 3 then 'GAP' end note 
  from (
    select id, 
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then dt + 1 
                else dt
           end d1,
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then 3 
                else dir
           end dir,
           case when lead(dir) over (partition by id order by dt) = 1 
                then lead(dt)  over (partition by id order by dt) - 1
                else lead(dt)  over (partition by id order by dt) 
            end d2
      from (
        select * from a unpivot (dt for dir in (validfrom as 1, validto as 2)) union 
        select * from b unpivot (dt for dir in (validfrom as 1, validto as 2)) ) )
  where dir in (1, 3)

Lúc đầu, dữ liệu được bỏ chia chỉ để có tất cả các ngày trong một cột, việc phân tích sâu hơn sẽ dễ dàng hơn. Union loại bỏ các giá trị trùng lặp. Cột dir thông báo nếu đây là from hoặc to ngày. Sau đó, lead logic được áp dụng, tùy thuộc vào loại hướng này. Tôi nghĩ nó có thể được đơn giản hóa phần nào :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố chuyển đổi Oracle SQL DATE bằng iBATIS qua Java JDBC

  2. 'KHÔNG THÍCH' trong một truy vấn SQL

  3. RobotFramework:cx_Oracle - FAIL:InternalError:Không có lỗi Oracle?

  4. SQL Multiple Columns trong mệnh đề IN để chuyển đổi sang JPA

  5. cx_Oracle:Làm cách nào để lặp lại tập hợp kết quả?