Я использую DB2 в этом случае, но я полагаю, что у этого есть общий ответ SQL. Я максимально упростил данные. Я рассчитываю на действия под названием «Претензии». Каждая претензия имеет уникальный номер претензии. Каждое действие имеет временную метку в формате «хммм». На самом деле, я не считаю действия, я считаю действия: в большинстве случаев один человек выполняет одно действие по одной заявке, а это одно действие. Но иногда человек выполняет несколько действий над одной заявкой, разделенных несколькими секундами или минутами: это также может быть одна сессия действия. Но если кто-то выполнил действие по заявке в 10:00, а затем выполнил действие по той же заявке в 13:00, это были бы два сеанса действий. Для моих целей временной интервал для того, что делает что-то одним сеансом действия против двух сеансов действия, составляет 3 часа, но это, конечно, произвольно. И нет никакого беспокойства о том, что окно открывается через полночь. Кроме того, у меня есть доступ только для чтения к этим данным, и я должен сделать это в одном утверждении. Спасибо.
Итак, вот некоторые данные (Таблица: ДЕЙСТВИЯ):
CLAIM_NO ACTTIME
AA 1424
BB 1134
CC 1221
DD 1425
DD 1512
EE 1619
FF 0928
FF 1518
GG 1348
HH 1332
II 1350
Я бы хотел превратить это в
CLAIM_NO ACTTIME
AA 1424
BB 1134
CC 1221
DD 1425
EE 1619
FF 0928
FF 1518
GG 1348
HH 1332
II 1350
(Обратите внимание, что вторая запись DD исчезла, но вторая запись FF все еще там).
Я выполнил это, присоединив таблицу к себе, при этом CLAIM_NO равно, а ACTTIME - между 3 часами ранее и 1 минутой раньше. Это позволяет мне получить строки, которые не принадлежат, и затем я использую EXCEPT для их устранения.
with excepto as (
select a.claim_no, b.acttime
from actions a
join actions b
on a.claim_no=b.claim_no
and a.acttime between (b.acttime-300) and (b.acttime-1)
)
select * from actions except select * from excepto
Но я бы хотел сделать это с одним соединением, поэтому нет необходимости "кроме". Это в надежде на то, что производительность будет лучше: у моих реальных данных будет больше столбцов, которые используются исключением, и, конечно, больше строк. И это, кроме оператора, кажется, сильно замедляет запрос. Я использую множество временных таблиц с помощью оператора with, и они кажутся намного медленнее, чем сумма их частей.