【问题标题】:Calculate no of days between two latest dates for each ID column in Oracle计算 Oracle 中每个 ID 列的两个最近日期之间的天数
【发布时间】:2019-12-27 22:25:57
【问题描述】:

我有一张这样的桌子:

ID Submitted Date
00001 20-JUL-2018
0000117-MAR-2017
00001@ 987654328@
0000220-JUL-2018
0000222-AUG-2018 kbd>
0000223-APR-2019

我想计算每个 ID 的最近两个提交日期之间的天数。

ID = 00001 一样,天数应为 20-JUN-2019 - 20-JUL-2018

我正在使用 Oracle 11G。

【问题讨论】:

  • 请向我们展示您的尝试并指出您遇到的问题。
  • Oracle 版本? ...

标签: sql oracle datediff


【解决方案1】:

略有不同;您可以找到每一行的上一个日期,还可以根据日期顺序分配排名:

select id, submitted_date,  
  lag(submitted_date) over (partition by id order by submitted_date) as previous_date,
  dense_rank() over (partition by id order by submitted_date desc) as rnk
from your_table;
ID    SUBMITTED_DATE PREVIOUS_DATE        RNK
----- -------------- ------------- ----------
00001 2017-03-17                            3
00001 2018-07-20     2017-03-17             2
00001 2019-06-20     2018-07-20             1
00002 2018-07-20                            3
00002 2018-08-22     2018-07-20             2
00002 2019-04-23     2018-08-22             1

然后将其用作内联视图以仅获取最新日期 - 排名第一:

select id, submitted_date, previous_date,
  submitted_date - previous_date as diff
from
(
  select id, submitted_date,  
    lag(submitted_date) over (partition by id order by submitted_date) as previous_date,
    dense_rank() over (partition by id order by submitted_date desc) as rnk
  from your_table
)
where rnk = 1;

ID    SUBMITTED_DATE PREVIOUS_DATE       DIFF
----- -------------- ------------- ----------
00001 2019-06-20     2018-07-20           335
00002 2019-04-23     2018-08-22           244

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT ID, 
    MAX(SUBMITTED_DATE - PREV_SUBMITTED_DATE) AS DIFF
    FROM
    (SELECT ID, SUBMITTED_DATE,  
    LAG(SUBMITTED_DATE) OVER (PARTITION BY ID ORDER BY SUBMITTED_DATE) AS PREV_SUBMITTED_DATE
    FROM
    (SELECT ID, SUBMITTED_DATE,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SUBMITTED_DATE DESC) AS RN
    FROM TABLE)
    WHERE RN <= 2)
    GROUP BY ID;
    

    或者

    SELECT ID, MAX(DIFF) AS DIFF FROM
    (SELECT ID,
    NTH_VALUE(SUBMITTED_DATE,1) OVER (PARTITION BY ID ORDER BY SUBMITTED_DATE DESC) -  
    NTH_VALUE(SUBMITTED_DATE,2) OVER (PARTITION BY ID ORDER BY SUBMITTED_DATE DESC) AS DIFF
    FROM TABLE)
    GROUP BY ID;
    

    干杯!!

    【讨论】:

      【解决方案3】:

      一种方法使用lag()lead()

      select t.*,
             (submitted_date - prev_sd) as day_diff
      from (select t.*,
                   lag(submitted_date) over (partition by id order by submitted_date) as prev_sd,
                   lead(submitted_date) over (partition by id order by submitted_date) as next_sd
            from t
           ) t
      where next_sd is null;
      

      这种方法避免了任何聚合。

      【讨论】:

        猜你喜欢
        • 2021-07-08
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 2015-02-26
        • 2019-09-27
        相关资源
        最近更新 更多