Date/Time Oracle 中不同行中相同字段的差异
Date/Time Difference in Oracle for same field in different rows
我有以下视图,我需要做的是获取具有相同 Vehicle 和 OrderCode 的每 2 条记录之间 ActionDate 字段的日期差异,我如何在 Oracle 数据库中实现此目的。
同时考虑到减去的日期应该是 模式 O - 模式 I
我需要获取差异列表,以便获得该时间的平均值。
感谢您的帮助。
使用 GROUP BY 并减去子查询中的日期
SELECT t.IO_SEQ, t.Vehicle, t.OrderCode, (SELECT MAX(t2.ActionDate) FROM table t2 WHERE t.IO_SEQ = t2.IO_SEQ) - (SELECT MIN(t2.ActionDate) FROM table t2 WHERE t.IO_SEQ = t2.IO_SEQ) AS ActionDiff
FROM table t
GROUP BY t.IO_SEQ, t.Vehicle, t.OrderCode
您可以在以下查询中使用 MAX 和 GROUP BY:
with src as
(
select 'O' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 16:34:35','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 15:27:09','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'O' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 14:03:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 13:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'O' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 01:40:58','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 00:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
)
select Vehicle,OrderCode, max(case when "MODE" = 'O' then ActionDate end) as MODE_O, max(case when "MODE" = 'I' then ActionDate end) as MODE_I from src
group by Vehicle,OrderCode
Added time difference:
select Vehicle,OrderCode, max(case when "MODE" = 'O' then ActionDate end) as MODE_O, max(case when "MODE" = 'I' then ActionDate end) as MODE_I, max(case when "MODE" = 'O' then ActionDate end) - max(case when "MODE" = 'I' then ActionDate end) as time_difference from src
group by Vehicle,OrderCode
你可以试试这个(没有测试所以它可能有一些语法错误)。这个想法是加入 table 本身:
select OMode.Vehicle, OMode.OrderCode, OMode.ActionDate-IMode.ActionDate
from
(select Vehicle, OrderCode, ActionDate from table where Mode='O' ) OMode,
(select Vehicle, OrderCode, ActionDate from table where Mode='I' ) IMode
where OMode.Vehicle = IMode.Vehicle and OMode.OrderCode = IMode.OrderCode
您可以使用解析 LAG() OVER() 函数来获取日期之间的差异。
例如,
SQL> WITH t AS
2 (
3 select 'O' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 16:34:35','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
4 union all
5 select 'I' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 15:27:09','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
6 union all
7 select 'O' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 14:03:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
8 union all
9 select 'I' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 13:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
10 union all
11 select 'O' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 01:40:58','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
12 union all
13 SELECT 'I' AS "MODE", 'V2987654321' AS Vehicle, '1411185798' AS OrderCode, to_date('2014-11-20 00:47:02','yyyy-mm-dd hh24:mi:ss') AS ActionDate FROM dual
14 )
15 SELECT "MODE",
16 Vehicle,
17 OrderCode,
18 TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
19 TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
20 ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
21 FROM t;
M VEHICLE ORDERCODE DT LAG_DT DIFF
- ----------- ---------- ------------------- ------------------- ----------
I V1234567890 1411196232 2014-11-19 15:27:09
O V1234567890 1411196232 2014-11-19 16:34:35 2014-11-19 15:27:09 .046828704
I V2987654321 1411185798 2014-11-20 00:47:02
O V2987654321 1411185798 2014-11-20 01:40:58 2014-11-20 00:47:02 .037453704
I V2987654321 1411206614 2014-11-20 13:47:02
O V2987654321 1411206614 2014-11-20 14:03:02 2014-11-20 13:47:02 .011111111
6 rows selected.
SQL>
注意: WITH 子句 用于构建 示例数据 ,在您的情况下你需要使用你实际的 table_name:
SELECT "MODE",
Vehicle,
OrderCode,
TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
FROM your_table;
我放 TO_CHAR 只是为了演示目的,您想要的输出是 DIFF 列。关于MODE,您可以将其添加到过滤谓词中。
我有以下视图,我需要做的是获取具有相同 Vehicle 和 OrderCode 的每 2 条记录之间 ActionDate 字段的日期差异,我如何在 Oracle 数据库中实现此目的。
同时考虑到减去的日期应该是 模式 O - 模式 I
我需要获取差异列表,以便获得该时间的平均值。
感谢您的帮助。
使用 GROUP BY 并减去子查询中的日期
SELECT t.IO_SEQ, t.Vehicle, t.OrderCode, (SELECT MAX(t2.ActionDate) FROM table t2 WHERE t.IO_SEQ = t2.IO_SEQ) - (SELECT MIN(t2.ActionDate) FROM table t2 WHERE t.IO_SEQ = t2.IO_SEQ) AS ActionDiff
FROM table t
GROUP BY t.IO_SEQ, t.Vehicle, t.OrderCode
您可以在以下查询中使用 MAX 和 GROUP BY:
with src as
(
select 'O' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 16:34:35','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 15:27:09','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'O' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 14:03:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 13:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'O' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 01:40:58','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
union all
select 'I' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 00:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
)
select Vehicle,OrderCode, max(case when "MODE" = 'O' then ActionDate end) as MODE_O, max(case when "MODE" = 'I' then ActionDate end) as MODE_I from src
group by Vehicle,OrderCode
Added time difference:
select Vehicle,OrderCode, max(case when "MODE" = 'O' then ActionDate end) as MODE_O, max(case when "MODE" = 'I' then ActionDate end) as MODE_I, max(case when "MODE" = 'O' then ActionDate end) - max(case when "MODE" = 'I' then ActionDate end) as time_difference from src
group by Vehicle,OrderCode
你可以试试这个(没有测试所以它可能有一些语法错误)。这个想法是加入 table 本身:
select OMode.Vehicle, OMode.OrderCode, OMode.ActionDate-IMode.ActionDate
from
(select Vehicle, OrderCode, ActionDate from table where Mode='O' ) OMode,
(select Vehicle, OrderCode, ActionDate from table where Mode='I' ) IMode
where OMode.Vehicle = IMode.Vehicle and OMode.OrderCode = IMode.OrderCode
您可以使用解析 LAG() OVER() 函数来获取日期之间的差异。
例如,
SQL> WITH t AS
2 (
3 select 'O' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 16:34:35','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
4 union all
5 select 'I' as "MODE", 'V1234567890' as Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 15:27:09','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
6 union all
7 select 'O' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 14:03:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
8 union all
9 select 'I' as "MODE", 'V2987654321' as Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 13:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
10 union all
11 select 'O' as "MODE", 'V2987654321' as Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 01:40:58','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
12 union all
13 SELECT 'I' AS "MODE", 'V2987654321' AS Vehicle, '1411185798' AS OrderCode, to_date('2014-11-20 00:47:02','yyyy-mm-dd hh24:mi:ss') AS ActionDate FROM dual
14 )
15 SELECT "MODE",
16 Vehicle,
17 OrderCode,
18 TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
19 TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
20 ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
21 FROM t;
M VEHICLE ORDERCODE DT LAG_DT DIFF
- ----------- ---------- ------------------- ------------------- ----------
I V1234567890 1411196232 2014-11-19 15:27:09
O V1234567890 1411196232 2014-11-19 16:34:35 2014-11-19 15:27:09 .046828704
I V2987654321 1411185798 2014-11-20 00:47:02
O V2987654321 1411185798 2014-11-20 01:40:58 2014-11-20 00:47:02 .037453704
I V2987654321 1411206614 2014-11-20 13:47:02
O V2987654321 1411206614 2014-11-20 14:03:02 2014-11-20 13:47:02 .011111111
6 rows selected.
SQL>
注意: WITH 子句 用于构建 示例数据 ,在您的情况下你需要使用你实际的 table_name:
SELECT "MODE",
Vehicle,
OrderCode,
TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
FROM your_table;
我放 TO_CHAR 只是为了演示目的,您想要的输出是 DIFF 列。关于MODE,您可以将其添加到过滤谓词中。