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

Chỉ thu gọn bản ghi ngày nếu giá trị không thay đổi - Oracle SQL

Điều này có vẻ hơi phức tạp, vì vậy tôi muốn cải thiện.

select distinct emp_id,
    nvl(x_start_date,
        lag(x_start_date)
            over (partition by emp_id
                order by rn)) as start_date,
    nvl(x_end_date,
        lead(x_end_date)
            over (partition by emp_id
                order by rn nulls first))
                    as end_date,
        rating,
        department
from (
    select emp_id, start_date, end_date, rating, department,
        case start_date
            when lag(end_date)
                over (partition by emp_id, rating, department
                    order by start_date) then null
            else start_date end as x_start_date,
        case end_date
            when lead(start_date)
                over (partition by emp_id, rating, department
                    order by start_date) then null
            else end_date end as x_end_date,
        rownum as rn
    from table1
)
where x_start_date is not null or x_end_date is not null
order by emp_id, start_date
/

Với dữ liệu thử nghiệm này:

    EMP_ID START_DA END_DATE RA DEPARTMENT               SALARY
---------- -------- -------- -- -------------------- ----------
      2000 01012010 01012011 A  HR                         9000
      2000 01012011 01012012 A  HR                        10000
      2000 01012012 01012013 A+ HR                        20000
      2000 01012013 01012014 A  HR                        20000
      2000 01012014 12319999 A  HR                        21000
      3000 01012011 01012012 B  Operations                50000
      3000 01012012 12319999 B  Operations                60000
      4000 07012011 07012012 B  Operations                50000
      4000 07012012 07012013 B  Operations                50000
      4000 07012013 12319999 B  Operations                60000

Tôi nhận được cái này:

    EMP_ID START_DA END_DATE RA DEPARTMENT
---------- -------- -------- -- --------------------
      2000 01012010 01012012 A  HR
      2000 01012012 01012013 A+ HR
      2000 01012013 12319999 A  HR
      3000 01012011 12319999 B  Operations
      4000 07012011 12319999 B  Operations

Tôi cũng đã thử với emp_id (4000 ) có ba phạm vi ngày liền nhau và nó xử lý được điều đó OK - where về cơ bản, mệnh đề làm cho các mục nhập trung gian biến mất. Đã chỉnh sửa để thêm :Hiện cũng hoạt động với các phạm vi ngày bổ sung của bạn cho 2000/A , vì tôi đã sửa thứ tự trong lead bên ngoài / lag phân vùng.

Truy vấn bên trong xóa tất cả trừ ngày bắt đầu đầu tiên và ngày kết thúc cuối cùng cho một khối liền kề và truy vấn bên ngoài sử dụng vòng thứ hai của leadlag để hợp nhất chúng thành các hàng giống hệt nhau, distinct sau đó sụp đổ.

Tôi giả sử start_dateend_dateDATE các trường, không phải VARCHAR2 và bạn có NLS_DATE_FORMAT đặt thành MMDDYYYY . Nếu chúng được lưu trữ dưới dạng chuỗi, đó là một ý tưởng tồi, bạn cần to_date() ở một số nơi để làm cho việc đặt hàng hoạt động bình thường.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để Kiểm tra xem tệp có phải là hình ảnh bằng PL / SQL hay không?

  2. hỗ trợ nhiều cơ sở dữ liệu cho cùng một classs JPA

  3. Cách xử lý ORA-02014:không thể chọn CẬP NHẬT từ chế độ xem với DISTINCT, GROUP BY, v.v.

  4. Bắt một xử lý kết nối Oracle gốc trong Hibernate 4 để chạy một proc được lưu trữ

  5. kết nối jdbc sử dụng trình điều khiển mỏng