#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 условия:
- то же описание.
- то же количество.
- дублированные строки должны быть созданы с интервалом в 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
);
Посмотрите демонстрацию.