oracle pl/sql平均起始日期差
我需要从该查询中获取日期的平均值oracle pl/sql平均起始日期差,sql,oracle,plsql,Sql,Oracle,Plsql,我需要从该查询中获取日期的平均值 select service_id,t.arrival_date - lag(t.arrival_date) over (partition by t.service_id order by t.arrival_date) as arrival_date_diff from table t 结果我得到了这些数据 +000000000 00:37:00.000000 +000000000 00:23:30.000000 +0
select service_id,t.arrival_date -
lag(t.arrival_date) over
(partition by t.service_id order by t.arrival_date) as arrival_date_diff
from table t
结果我得到了这些数据
+000000000 00:37:00.000000
+000000000 00:23:30.000000
+000000000 00:07:04.000000
我试着用
AVG(arrival_date_diff) to_date(round(avg(to_number(to_char(arrival_date_diff, 'J')))),'J')
如何从该日期差值中获取平均值,并将平均日期转换为分钟
样本数据:
04/06/18 08:57:34,000000
04/06/18 09:34:34,000000
04/06/18 09:34:34,000000
预期结果:以分钟为单位的平均值(例如:8.5)
提前感谢当您减去两个日期数据类型值时,结果是天数。例如(基于Scott的模式): 如果要选择平均差,则必须使用内联视图或CTE作为平均值,并且不能同时使用分析函数,即
AVG(滞后(…)
最后,当您需要分钟数时,将结果(天,对吗?)乘以24(一天中有24小时)和60(一小时中有60分钟):
[编辑:添加时间戳示例]
SQL> create table test (datum timestamp);
Table created.
SQL> select * From test;
DATUM
---------------------------------------------------------------------------
04.06.18 08:57:34,000000
04.06.18 09:34:34,000000
04.06.18 09:34:34,000000
SQL>
SQL> select datum - lag(datum) over (order by datum) diff
2 from test;
DIFF
---------------------------------------------------------------------------
+000000000 00:37:00.000000
+000000000 00:00:00.000000
SQL> -- cast timestamps to dates first, then subtract them; for the final result,
SQL> -- multiply number of days by 24 hours (in a day) and 60 minutes (in an hour)
SQL> select avg(diff) * 24 * 60 avg_minutes
2 from (select cast(datum as date) - cast(lag(datum) over (order by datum) as date) diff
3 from test
4 );
AVG_MINUTES
-----------
18,5
SQL>
你能提供一些样本数据和预期结果吗?这真的很有帮助这可能有助于您创建一个自定义聚合来为时间戳执行此操作,请参阅我获取错误
ORA-00932:不一致的数据类型:预期的数字从一天到一秒的间隔时间看起来OP正在获取一个间隔时间。我猜他们的arrival\u date
字段是一个时间戳,而不是一个日期,在这种情况下,他们必须这样做才能工作。对;感谢您对Joseleg@kfinity的评论和有用的链接。斯科特没有时间戳,所以我用了我的时间戳。
SQL> with inter as
2 (select deptno,
3 hiredate - lag(hiredate) over
4 (partition by deptno order by hiredate) diff
5 from emp
6 )
7 select deptno,
8 avg(diff) avg_diff_days,
9 --
10 avg(diff) * (24 * 60) minutes
11 from inter
12 group by deptno;
DEPTNO AVG_DIFF_DAYS MINUTES
---------- ------------- ----------
10 114 164160
20 175,5 252720
30 57,2 82368
SQL>
SQL> create table test (datum timestamp);
Table created.
SQL> select * From test;
DATUM
---------------------------------------------------------------------------
04.06.18 08:57:34,000000
04.06.18 09:34:34,000000
04.06.18 09:34:34,000000
SQL>
SQL> select datum - lag(datum) over (order by datum) diff
2 from test;
DIFF
---------------------------------------------------------------------------
+000000000 00:37:00.000000
+000000000 00:00:00.000000
SQL> -- cast timestamps to dates first, then subtract them; for the final result,
SQL> -- multiply number of days by 24 hours (in a day) and 60 minutes (in an hour)
SQL> select avg(diff) * 24 * 60 avg_minutes
2 from (select cast(datum as date) - cast(lag(datum) over (order by datum) as date) diff
3 from test
4 );
AVG_MINUTES
-----------
18,5
SQL>