Поиск дубликатов столбцов внутри одной таблицы

#sql #sqlite

#sql #sqlite

Вопрос:

У меня возникли некоторые проблемы с запросом sqlite:

 select t.* from transactions t
join (
    select description, amount, created_at, count(*) from transactions
    where account_id = 1
    group by description, amount having count(*) > 1
) t2
ON t.description = t2.description
    and t.amount = t2.amount
    and strftime('%s', t2.created_at) - strftime('%s', t.created_at) between -60 and 60
;
 

В принципе, у меня есть таблица с 3 важными столбцами, я хочу получить дублированные строки, если выполняются 3 условия:

  1. то же описание.
  2. то же количество.
  3. дублированные строки должны быть созданы с интервалом в 60 секунд.

Это работает частично, если разница во времени составляет от -60 до 60, тогда он правильно отображает 2 дублирующиеся строки, все, что выходит за пределы этого диапазона, показывает только ту, которая не должна происходить.

Примерные данные:

 insert into transactions (description, amount, created_at) values ('Internet', 19.99, '2021-11-29 11:30:00');
insert into transactions (description, amount, created_at) values ('Internet', 12.99, '2021-11-29 11:31:00');
 

При выполнении запроса с этими значениями ничего не должно отображаться. Потому что сумма отличается, даже если даты находятся в пределах 1 минуты.

 insert into transactions (description, amount, created_at) values ('Internet', 12.99, '2021-11-29 11:33:00');
insert into transactions (description, amount, created_at) values ('Internet', 12.99, '2021-11-29 11:35:00');
 

При выполнении запроса с этими значениями ничего не должно отображаться. Потому что даты не находятся в пределах 1 минуты.

 insert into transactions (description, amount, created_at) values ('Internet', 19.99, '2021-11-29 11:30:00');
insert into transactions (description, amount, created_at) values ('Internet', 19.99, '2021-11-29 11:31:00');
 

При выполнении запроса с этими значениями он должен отображать обе строки.

Комментарии:

1. В вашем подзапросе вы группируете по description , но не указываете функцию группировки для amount и created_at . Я не уверен, является ли это причиной вашей проблемы, но всегда лучше явно выбирать значение. Например max(created_at) .

2. Опубликуйте образцы данных и ожидаемые результаты в виде текста, чтобы уточнить, что вы хотите.

3. @forpas спасибо за ваш совет, я добавил примеры данных с ожидаемыми результатами.

4. @KIKOSoftware Внутри подзапроса я группирую по описанию и количеству, и вы частично правы, потому что мне нужно добавить групповую функцию для created_at . Проблема в том, что max (created_at) не будет работать, потому что мне нужно, чтобы они были на расстоянии 1 минуты друг от друга, а не только самые последние.

Ответ №1:

Вы можете сделать это с помощью EXISTS :

 SELECT t1.*
FROM transactions t1
WHERE EXISTS (
  SELECT 1 
  FROM transactions t2
  WHERE t2.rowid <> t1.rowid
    AND t2.description = t1.description
    AND t2.amount = t1.amount
    AND ABS(strftime('%s', t2.created_at) - strftime('%s', t1.created_at)) <= 60
);
 

Посмотрите демонстрацию.