表:测试

选择同一天时差小于 2 小时的行(按日期分组)。
这里输出应该是前两行,因为前两行的时间差(18-JAN-15 01.08.40.000000000 PM - 18-JAN-15 11.21.28.000000000 AM < 2 小时)
NB: compare rows of same date.
Run Code Online (Sandbox Code Playgroud)
输出:

CREATE TABLE TEST
( "ID" VARCHAR2(20 BYTE),
"CAM_TIME" TIMESTAMP (6)
)
Insert into TEST (ID,CAM_TIME) values ('1',to_timestamp('18-JAN-15 11.21.28.000000000 AM','DD-MON-RR HH.MI.SSXFF AM'));
Insert into TEST (ID,CAM_TIME) values ('2',to_timestamp('18-JAN-15 01.08.40.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'));
Insert into TEST (ID,CAM_TIME) values ('3',to_timestamp('23-JAN-15 09.18.40.000000000 AM','DD-MON-RR HH.MI.SSXFF AM'));
Insert into TEST (ID,CAM_TIME) values ('4',to_timestamp('23-JAN-15 04.22.22.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'));
Run Code Online (Sandbox Code Playgroud)
这个自连接查询完成以下工作:
select distinct t1.id, t1.cam_time
from test t1 join test t2 on t1.rowid <> t2.rowid
and trunc(t1.cam_time) = trunc(t2.cam_time)
where abs(t1.cam_time-t2.cam_time) <= 2/24
order by t1.id
Run Code Online (Sandbox Code Playgroud)
编辑:
如果 cam_time 是 time_stamp 类型,那么条件应该是:
where t1.cam_time between t2.cam_time - interval '2' Hour
and t2.cam_time + interval '2' Hour
Run Code Online (Sandbox Code Playgroud)
我采取了稍微不同的策略并使用了LAG()和LEAD()分析函数:
WITH mydata AS (
SELECT 1 AS id, timestamp '2015-01-15 11:21:28.000' AS cam_time
FROM dual
UNION ALL
SELECT 2 AS id, timestamp '2015-01-15 13:08:40.000' AS cam_time
FROM dual
UNION ALL
SELECT 3 AS id, timestamp '2015-01-23 09:18:40.000' AS cam_time
FROM dual
UNION ALL
SELECT 4 AS id, timestamp '2015-01-23 16:22:22.000' AS cam_time
FROM dual
)
SELECT id, cam_time FROM (
SELECT id, cam_time
, LAG(cam_time) OVER ( PARTITION BY TRUNC(cam_time) ORDER BY cam_time ) AS lag_time
, LEAD(cam_time) OVER ( PARTITION BY TRUNC(cam_time) ORDER BY cam_time ) AS lead_time
FROM mydata
) WHERE CAST(lead_time AS DATE) - CAST(cam_time AS DATE) < 1/12
OR CAST(cam_time AS DATE) - CAST(lag_time AS DATE) < 1/12
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4488 次 |
| 最近记录: |