【问题标题】:Find duplicates columns within on the same table在同一个表中查找重复的列
【发布时间】: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 个条件,我想获得重复的行:

  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');

使用这些值执行查询时,它必须显示两行。

【问题讨论】:

  • 在您的子查询中,您按description 分组,但您没有为amountcreated_at 指定grouping function。我不确定这是否是您的问题的原因,但明确选择一个值总是更好。例如max(created_at).
  • 以文本形式发布示例数据和预期结果以阐明您想要什么。
  • @forpas 感谢您的建议,我已经添加了具有预期结果的示例数据。
  • @KIKOSoftware 在子查询中,我按描述和数量进行分组,您部分正确,因为我需要为 created_at 添加组函数。问题是 max(created_at) 不起作用,因为我需要它们相隔 1 分钟,而不仅仅是最近的一个。

标签: sql sqlite


【解决方案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
);

请参阅demo

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2018-10-15
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多