Sql 计算Oracle中每个ID列的两个最新日期之间的天数

Sql 计算Oracle中每个ID列的两个最新日期之间的天数,sql,oracle,datediff,Sql,Oracle,Datediff,我有一张这样的桌子: ID提交日期 000012018年7月20日 000012017年3月17日 000012019年6月20日 000022018年7月20日 000022018年8月22日 000022019年4月23日 我想计算每个ID最近两个提交日期之间的天数 与ID=00001一样,天数应为2019年6月20日-2018年7月20日 我正在使用Oracle11g 试试这个: SELECT ID, MAX(SUBMITTED_DATE - PREV_SUBMITTED_DATE) A

我有一张这样的桌子:

ID
提交日期

00001
2018年7月20日

00001
2017年3月17日

00001
2019年6月20日

00002
2018年7月20日

00002
2018年8月22日

00002
2019年4月23日

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

与ID=00001一样,天数应为2019年6月20日-2018年7月20日

我正在使用Oracle11g

试试这个:

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(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;
干杯

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

此方法避免任何聚合。

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


此方法避免了任何聚合。

轻微变化;您可以找到每行的上一个日期,还可以根据日期顺序指定排名:

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

轻微的变化;您可以找到每行的上一个日期,还可以根据日期顺序指定排名:

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

请告诉我们您尝试了什么,并指出您遇到了什么问题。Oracle版本。。。请告诉我们您尝试了什么,并指出您遇到了什么问题。Oracle版本。。。