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

Kết hợp hiệu quả với một truy vấn con tương quan

Hãy thử điều này:

SELECT  rt.rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty
FROM    (
    SELECT  *
    FROM    (
        SELECT  r.*, t.*, SUM(doUse) OVER (PARTITION BY rangeId ORDER BY aDate) AS span
        FROM    (
            SELECT  r.rangeId, startDate, MAX(day) AS dm
            FROM    Range r, Days d
            WHERE   d.rangeid = r.rangeid
            GROUP BY
                r.rangeId, startDate
            ) r, Dates t
        WHERE   t.adate >= startDate
        ORDER BY
            rangeId, t.adate
        )
    WHERE
        span <= dm
    ) rt, Days d
WHERE   d.rangeId = rt.rangeID
    AND d.day = GREATEST(rt.span, 1)

P. S. Đối với tôi, dường như điểm duy nhất để giữ tất cả Dates này trong cơ sở dữ liệu là để có được một lịch liên tục với các ngày lễ được đánh dấu.

Bạn có thể tạo lịch có độ dài tùy ý trong Oracle bằng cách sử dụng cấu trúc sau:

SELECT :startDate + ROWNUM
FROM   dual
CONNECT BY
       1 = 1
WHERE  rownum < :length

và chỉ giữ các ngày lễ trong Dates . Một phép tham gia đơn giản sẽ cho bạn biết Dates nào là ngày lễ và khô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. Chức năng tổng hợp Oracle để phân bổ số tiền

  2. Có bao nhiêu chỉ mục cơ sở dữ liệu là quá nhiều?

  3. Cập nhật hàng với truy vấn con trả lại nhiều hàng

  4. Chuyển đổi Múi giờ Oracle (sử dụng from_tz)

  5. Cách lấy một phần của chuỗi khớp với biểu thức chính quy trong Oracle SQL