考虑以下问题;
SELECT id, MIN(updated_at)
FROM accounts
GROUP BY mem_id, account, sub_account
HAVING COUNT(*) > 1
通过对所选字段进行分组并在这些分组中打印id
和最小updated_at
值来查找重复项的简单语句。
我遇到的问题是它会打印最小的updated_at
值,但用它打印的id
可能与某些行中的其他重复条目相关联。
似乎它是从最小id
值中单独(并随机)选择每个分组中的updated_at
。如何才能获得每次查询与id
最小值相关联的updated_at
的预期行为?
示例数据:
(id, mem_id, account, sub_account, updated_at) VALUES (2351, 12, 123456, 12345, 2016-04-30)
(id, mem_id, account, sub_account, updated_at) VALUES (7638, 12, 123456, 12345, 2016-06-15)
我的目标是获得这两个中id
值updated_at
的最小值。因此我想要id 2351
,但在某些行中,它会随机返回另一个ID。
答案 0 :(得分:0)
可能必须使用子选择和
的其他组select id, update_at
from accounts
where update_at in (
select MIN(updated_at)
FROM accounts
GROUP BY mem_id, account, sub_account
HAVING COUNT(*) > 1 )
答案 1 :(得分:0)
我最终使用的查询大部分都是这个;
SELECT a.* from accounts a
JOIN
(
SELECT *, MIN(updated_at) min_date
FROM accounts
GROUP BY mem_id, account, sub_account
HAVING COUNT(*) > 1
) b
ON
a.mem_id = b.mem_id
AND
a.account = b.account
AND
a.sub_account = b.sub_account
AND
a.updated_at = b.min_date
基本上,为每个分组获取updated_at
的最小值的自联接然后根据有关它们的不同信息匹配行。在我的情况下,每个条目只有1个重复,因此这可能不适用于涉及多个重复的情况。然后我只使用该列表删除了我需要删除的帐户。