Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL за автоматично генериране на липсващи дати и цена от непосредствено предишна дата за липсваща дата в таблицата

Използвах your_table като една таблица с outerjoin , както се използва last_value за да вмъкнете предишни данни, вижте това :)

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;

цигулка тук

Можете да използвате lag() функция също, но няма да попълни данни, ако разликата в датата е повече от една., тя попълва само непосредствено предишни данни,

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

-редактиране -

за вашите данни:

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;

или малко по-конкретно:използвайте по-долу:

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;

вижте fiddle тук




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.hibernate.tool.schema.spi.CommandAcceptanceException:Не може да се изпълни команда

  2. ORA-01882:регионът на часовата зона не е намерен в Entity Framework

  3. Използвайте R променливи към SQL заявка

  4. Преодоляване на ограничението за групови вмъквания през връзка към база данни

  5. Изтрийте дублиращи се записи с помощта на rownum в sql