【问题标题】:Query to obtain start and end dates from table with only start dates查询从只有开始日期的表中获取开始和结束日期
【发布时间】:2017-04-01 19:47:07
【问题描述】:

我有一个包含日期和值的表格,例如:

START_DATE    VALUE
------------  -----
01-JAN-2015     A
01-MAR-2015     B
01-AUG-2015     (null)
15-AUG-2015     A
01-SEP-2015     C
01-JAN-2016     B
01-JUN-2016     C

每个 start_date 代表值更改的日期。 我正在尝试获取包含结束日期作为下一个日期(按时间顺序)减去一天的输出,即:

START_DATE    END_DATE    VALUE
----------    ----------  -----
01-JAN-2015   28-FEB-2015   A
01-MAR-2015   31-JUL-2015   B
01-AUG-2015   14-AUG-2015   (null)
15-AUG-2015   31-AUG-2015   A
01-SEP-2015   31-DEC-2015   C
01-JAN-2016   31-MAY-2016   B
01-JUN-2016   (null)        C

我可以使用查询来获取每个间隔的开始和结束日期吗?...也许使用分层查询?

这里是我在开发过程中使用的一个可以节省一些时间的摘录:

with my_table 
          as(
          select to_date('01-JAN-2015') start_date,'A' value from dual
          union
          select to_date('01-MAR-2015') start_date,'B' value from dual
          union
          select to_date('01-AUG-2015') start_date,'' value from dual
          union
          select to_date('15-AUG-2015') start_date,'A' value from dual
          union
          select to_date('01-SEP-2015') start_date,'C' value from dual
          union
          select to_date('01-JAN-2016') start_date,'B' value from dual
          union
          select to_date('01-JUN-2016') start_date,'C' value from dual
          )
          select ...

【问题讨论】:

  • 您是如何获得 30-APR 作为第一行的 end_date 的?下一行的 start_date 是 01-MAR 什么时候?
  • 谢谢@mathguy...正确的结束日期应该是 28_FEB-2015。帖子已更正。

标签: sql oracle


【解决方案1】:
select start_date, lead(start_date) over (order by start_date) - 1 as end_date, value
from   my_table
;

【讨论】:

    【解决方案2】:

    试试这个

    使用 AS(从 SALESNEW A 中选择 ROWNUM 作为 RN , A.*)

    SELECT X.START_DATE, Y.START_DATE-1 AS END_DATE, X.VALUE FROM A X , A Y WHERE (CASE WHEN X.RN>=1 THEN X.RN+1 END) = Y.RN(+);

    【讨论】:

    • 你应该检查row_num() syntaxis
    • 抱歉这里是修改后的查询 WITH A AS (SELECT ROWNUM AS RN , A.* FROM SALESNEW A) SELECT X.START_DATE, Y.START_DATE-1 AS END_DATE, X.VALUE FROM AX , AY WHERE (CASE WHEN X.RN>=1 THEN X.RN+1 END) = Y.RN(+)
    • 我正在使用 oracle,我在我的 SQL 开发人员中运行它,它工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多