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

SQL untuk secara otomatis menghasilkan tanggal dan harga yang hilang dari tanggal sebelumnya untuk tanggal yang hilang dalam tabel

Saya telah menggunakan your_table sebagai satu tabel dengan outerjoin , seperti yang digunakan last_value untuk memasukkan data sebelumnya, lihat ini :)

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;

biola di sini

Anda bisa menggunakan lag() berfungsi juga , tetapi tidak akan mengisi data jika selisih tanggal lebih dari satu., hanya mengisi data langsung sebelumnya,

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

-mengedit -

untuk data Anda:

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;

atau sedikit lebih spesifik:gunakan di bawah ini:

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;

lihat biola di sini




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa terhubung ke database Oracle sebagai SYS menggunakan string koneksi ADO?

  2. Oracle regex menggantikan beberapa kemunculan string yang dikelilingi oleh koma

  3. mengumpulkan informasi dba_users di database Oracle saat terhubung sebagai pengguna

  4. Cara Mendapatkan Nama Bulan dari Tanggal di Oracle

  5. mengambil data mentah yang panjang ke dalam variabel gumpalan