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

SQL để tự động tạo ngày bị thiếu và giá từ ngày trước đó ngay lập tức cho ngày bị thiếu trong bảng

Tôi đã sử dụng your_table làm một bảng với outerjoin , như được sử dụng last_value để chèn dữ liệu trước đó, hãy xem cái này :)

SELECT last_value(m.data ignore nulls) over (order by n.mydate) data,
     n.mydate
FROM
     (SELECT DATA, mydate FROM your_table
     ) m,
     (SELECT TRUNC(SYSDATE, 'MM')-1+LEVEL mydate FROM dual CONNECT BY LEVEL <= 30
     )n
WHERE m.mydate(+) = n.mydate
ORDER BY n.mydate;

fiddle here

Bạn có thể sử dụng lag() cũng hoạt động, nhưng nó sẽ không lấp đầy dữ liệu nếu khoảng cách ngày nhiều hơn một., nó chỉ lấp đầy dữ liệu trước đó ngay lập tức,

nvl(m.data, lag(m.data)over(order by n.mydate))

- chỉnh sửa -

cho dữ liệu của bạn:

SELECT n.mydate VALUE_DATE,
     last_value(m.STK_EXCH IGNORE NULLS) OVER (ORDER BY n.mydate) STK_EXCH,
     last_value(m.SECURITY IGNORE NULLS) OVER (ORDER BY n.mydate) SECURITY,
     last_value(m.mkt_price IGNORE NULLS) OVER (ORDER BY n.mydate) MKT_PRICE
FROM
     (SELECT VALUE_DATE, STK_EXCH, SECURITY, MKT_PRICE FROM MKT
     ) m,
     (SELECT TRUNC(SYSDATE, 'MM')-1+LEVEL mydate FROM dual CONNECT BY LEVEL <= 30
     )n
WHERE TRUNC(m.VALUE_DATE(+)) = TRUNC(n.mydate)
ORDER BY n.mydate;

hoặc cụ thể hơn một chút:sử dụng bên dưới:

SELECT full_date,
     NVL(stk_exch,last_value(stk_exch IGNORE NULLS)OVER(ORDER BY full_date))stk_exch,
     NVL(security,last_value(security IGNORE NULLS)OVER(ORDER BY full_date))security,
     NVL(mkt_price,last_value(mkt_price IGNORE NULLS)OVER(ORDER BY full_date))mkt_price
FROM
     (SELECT TRUNC(m.vd,'MM')-1+LEVEL FULL_DATE
     FROM
          (SELECT MIN(VALUE_DATE) vd FROM mkt
          WHERE TO_CHAR( value_date, 'MM/YYYY') = TO_CHAR(sysdate-12,'MM/YYYY') -- this line may vary to your requirement
          ) m
     CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(M.VD), 'DD')
     )first_q,
     ( SELECT value_date, stk_exch, SECURITY, mkt_price FROM mkt
     )r
WHERE first_q.full_date = TRUNC(r.value_date(+))
ORDER BY full_date;

xem fiddle tại đây




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa bảng khỏi cơ sở dữ liệu Oracle 10g

  2. Làm cách nào để cx-oracle liên kết kết quả của một truy vấn với một từ điển thay vì một tuple?

  3. Bảng Temp toàn cầu - SQL Server vs Oracle

  4. Chia chuỗi thành các mã thông báo trong pl sql

  5. mảng hoặc danh sách vào Oracle bằng cfprocparam