创建所需的 SQL 脚本

Creating required SQL script

我的下一个问题是关于根据需要创建 SQL 脚本。这是我的愿望: 我想从我的 TEST1 table select IDDOCID 列上的两次连续操作之间的差异(减法)小于三分钟。这是我创建 table 并插入测试日期脚本:

CREATE TABLE TEST1(ID NUMBER , DOC CHAR(2), C_TIME TIMESTAMP);

INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(100,'A1',timestamp '2020-09-27 13:20:43');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(100,'A2',timestamp '2020-09-27 13:21:12');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(100,'A3',timestamp '2020-09-27 13:25:40');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(101,'A1',timestamp '2020-09-27 14:12:20');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(101,'A2',timestamp '2020-09-27 14:20:32');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(102,'A1',timestamp '2020-09-27 11:10:54');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(102,'A2',timestamp '2020-09-27 14:30:52');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(102,'A3',timestamp '2020-09-27 15:21:15');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(103,'A1',timestamp '2020-09-27 17:41:11');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(103,'A2',timestamp '2020-09-27 17:42:56');
INSERT INTO TEST1(ID,DOC,C_TIME) VALUES(103,'A3',timestamp '2020-09-27 17:44:01');
COMMIT;

因此,我需要的输出将是绿色行:

您可以使用 lag():

select t.*
from (
    select t.*, lag(c_time) over(partition by id order by c_time) lag_c_time
    from test1 t
) t
where c_time < lag_c_time + interval '3' minute or lag_c_ctime is null

不清楚您是否希望每个 id 排在第一行。上面的查询带来了它——如果你不这样做,只需从 where 子句中删除条件 lag_c_time is null

如果我理解正确,您不仅需要使用 lag 的前一行值,而且如果是 id 的第一条记录,还应使用 [=12= 检查下一行的时间差异] 然后最后减去并检查差异,

select t.id,t.doc,t.c_time
from (
    select t.*
         , lag(c_time,1) over(partition by id order by c_time) lag_c_time
         , lead(c_time,1) over(partition by id order by c_time) lead_c_time
    from test1 t
) t
where abs(extract( minute from (c_time - coalesce(lag_c_time,lead_c_time)))) < 3