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版本。。。