SQL 自动从上一个日期为表中缺失的日期生成缺失的日期和价格

标签 sql oracle

我有一个包含以下字段的表 MKT value_date,stk_exch,security,mkt_price,source,currency,name每天 500 只证券(不包括周六和周日以及其他市场假期)。

我需要一个 sql 来自动生成缺失日期的缺失日期和价格。因此,如果星期五是 2013 年 7 月 26 日,星期六和星期日是 27 日和 28 日,则该表中将缺少 27 日和 28 日的日期和价格。

因此,在对 2013 年 7 月整个月的价格进行假脱机时,我应该获取所有日期和缺少的日期,例如:27 和 28,sql 将采用 26 日的价格。

我正在使用甲骨文

value_date   stk_exch    security      mkt_price
-------------------------------------------------    
26/07/2013   BSE         BANKBARODA    565.85   
29/07/2013   BSE         BANKBARODA    585.85   

现在 SQL 应该返回
value_date  stk_exch     security      mkt_price
-------------------------------------------------
26/07/2013  BSE          BANKBARODA    565.85   
27/07/2013  BSE          BANKBARODA    565.85   
28/07/2013  BSE          BANKBARODA    565.85   
29/07/2013  BSE          BANKBARODA    585.85   

最佳答案

我已经将 your_table 作为一张 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;

fiddle here

您可以使用 lag()功能也一样,但如果日期间隔大于 1,它不会填充数据,它只填充前一个数据,
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;

see fiddle here

关于SQL 自动从上一个日期为表中缺失的日期生成缺失的日期和价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17939705/

相关文章:

sql select with 不包含

java - JPA - SQLException创建记录

php - 如何获取刚刚执行的sql查询的id(在php中)

Java SQL 语句 - 索引数组越界

mysql - 表有成对匹配的记录,只需选择和更新一条记录

sql - PostgreSQL 按 24 小时时间段中午到中午分组

mysql - 如何在 mysql 连接中选择可能不存在的行

oracle - Io 异常 : Oracle Error ORA-12650 after upgrading Oracle to 12g

一个月中所有天数的 SQL 查询

python - 使用 pyodbc 连接到 Oracle 数据库