【发布时间】:2022-01-06 16:43:51
【问题描述】:
我在使用 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');
使用这些值执行查询时,它必须显示两行。
【问题讨论】:
-
在您的子查询中,您按
description分组,但您没有为amount和created_at指定grouping function。我不确定这是否是您的问题的原因,但明确选择一个值总是更好。例如max(created_at). -
以文本形式发布示例数据和预期结果以阐明您想要什么。
-
@forpas 感谢您的建议,我已经添加了具有预期结果的示例数据。
-
@KIKOSoftware 在子查询中,我按描述和数量进行分组,您部分正确,因为我需要为 created_at 添加组函数。问题是 max(created_at) 不起作用,因为我需要它们相隔 1 分钟,而不仅仅是最近的一个。