查询以查找分组中的最小日期

时间:2016-06-22 18:09:25

标签: mysql sql

考虑以下问题;

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)

我的目标是获得这两个中idupdated_at的最小值。因此我想要id 2351,但在某些行中,它会随机返回另一个ID。

2 个答案:

答案 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个重复,因此这可能不适用于涉及多个重复的情况。然后我只使用该列表删除了我需要删除的帐户。