【问题标题】:Create Cost Period based on Start Date - PL/SQL根据开始日期创建成本期间 - PL/SQL
【发布时间】:2015-09-01 03:37:36
【问题描述】:

甲骨文 11g

我想根据新费用的开始日期为每个费用设置结束日期

为以下数据设置结束日期

输入:

Part number Site Cost           Start Date  End Date

000118-X    SR  8.926035461     10/1/2011   
000118-X    SR  10.7990022141   12/1/2011   
000118-X    SR  10.79900221     10/1/2012   
000118-X    SR  11.1574523796   12/1/2012   
000118-X    SR  11.15745238     10/1/2013   
000118-X    SR  14.054703823    12/1/2013   
000118-X    SR  16.4416037192   12/1/2014

期望的输出:结束日期是下一条记录的开始日期-1

Part number Site Cost           Start Date  End Date

000118-X    SR  8.926035461     10/1/2011   11/30/2011
000118-X    SR  10.7990022141   12/1/2011   09/30/2012
000118-X    SR  10.79900221     10/1/2012   11/31/2012
000118-X    SR  11.1574523796   12/1/2012   09/30/2013
000118-X    SR  11.15745238     10/1/2013   11/30/2013
000118-X    SR  14.054703823    12/1/2013   11/30/2014
000118-X    SR  16.4416037192   12/1/2014   

【问题讨论】:

  • “基于新成本的开始日期”在示例中不清楚。
  • 每一行都有一个新的成本和新的日期,所以我需要把日期和结束日期放在以前的成本上。输出已经附加了我想要的结束日期。
  • 但在您的输出中,结束日期是随机分配的。这是否类似于您要插入表中的修复值?
  • 是的,它是一个固定值。例如,第一条记录的结束日期是第二条记录的开始日期-1,依此类推。
  • 好的,结束日期是下一行的开始日期减一。你有没有尝试过?

标签: sql oracle oracle11g lead


【解决方案1】:

你需要使用LEAD()解析函数

有关架构设置,请参阅SQL Fiddle Demo

SQL> WITH cost AS
  2    (SELECT lead(start_date) OVER (ORDER BY start_date) rn,
  3      t.*
  4    FROM t
  5    )
  6  SELECT part_number ,
  7         site,
  8         cost,
  9         start_date,
 10         rn -1 end_date
 11  FROM cost;

PART_NUMBER SITE       COST START_DATE END_DATE
----------- ---- ---------- ---------- ----------
000118-X    SR        8.926 10/01/2011 11/30/2011
000118-X    SR         10.8 12/01/2011 09/30/2012
000118-X    SR         10.8 10/01/2012 11/30/2012
000118-X    SR        11.16 12/01/2012 09/30/2013
000118-X    SR        11.16 10/01/2013 11/30/2013
000118-X    SR        14.05 12/01/2013 11/30/2014
000118-X    SR        16.44 12/01/2014

7 rows selected.

SQL>

【讨论】:

    【解决方案2】:

    首先为每个元素分配一个行号

    然后加入以将每一行与下一行匹配。
    并减去一天的日期

    SQL Fiddle Demo

    with cost as (
        SELECT         
            ROW_NUMBER() OVER (ORDER BY start_date) as R, t.*
        FROM testSQL t
    )
    SELECT 
        c1.part_number ,
        c1.site,
        c1.cost,  
        c1.start_date,
        c2.start_date - 1
    FROM cost c1
    left join cost c2 on c1.r = c2.r - 1
    

    【讨论】:

    • 不需要昂贵的join操作,只需使用LEAD()
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多