Mysql 如何根据日期和条件获取最早的唯一行
我有一张桌子,看起来如下所示Mysql 如何根据日期和条件获取最早的唯一行,mysql,Mysql,我有一张桌子,看起来如下所示 email tag updated email1@domain.com tag1 2019-10-01 email1@domain.com tag2 2018-10-01 email2@other.com tag3 2019-10-01 email2@other.com tag4 2017-04-01 email3@xyz.com tag4 2017-11-01 email3@xyz
email tag updated
email1@domain.com tag1 2019-10-01
email1@domain.com tag2 2018-10-01
email2@other.com tag3 2019-10-01
email2@other.com tag4 2017-04-01
email3@xyz.com tag4 2017-11-01
email3@xyz.com tag1 2019-10-01
email3@xyz.com tag3 2018-11-08
查询需要执行以下操作:
email1@domain.com tag2 2018-10-01
使用min()
聚合函数
select t1.*, t2.tag from (
select min(updated) updated, email
from tableA
where tag in ('tag1', 'tag2')
group by email) as t1
left join tableA t2 on t2.email = t1.email and t1.updated = t2.updated
使用min()
聚合函数
select t1.*, t2.tag from (
select min(updated) updated, email
from tableA
where tag in ('tag1', 'tag2')
group by email) as t1
left join tableA t2 on t2.email = t1.email and t1.updated = t2.updated
在MySQL 8+上,我会在这里使用
行数
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY updated) rn
FROM yourTable
)
SELECT email, tag, updated
FROM cte
WHERE rn = 1 AND tag IN ('tag1', 'tag2');
CTE为每组电子邮件记录分配一个行号,从最早的一个开始。然后,子查询查找最早的记录,但仅当它们的标记是MySQL 8+上的
tag1
或tag2
时,我才会在这里使用行数
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY updated) rn
FROM yourTable
)
SELECT email, tag, updated
FROM cte
WHERE rn = 1 AND tag IN ('tag1', 'tag2');
CTE为每组电子邮件记录分配一个行号,从最早的一个开始。然后,子查询查找最早的记录,但仅当它们的标记为
tag1
或tag2
时,才可以这样做,但我需要将select max更改为select min,因为我需要最早的实例。感谢这将在输出中为email1@domain.com
。你应该只通过电子邮件进行聚合。这是可行的,但我需要将select max更改为select min,因为我需要最早的实例。感谢这将在输出中为email1@domain.com
。你应该只通过电子邮件聚合..谢谢你的回答。我不确定我是否做错了什么,但是我复制了你的答案,修改了列名和表名,然后我得到了一个错误。我正在使用Dbeaver,它应该使用MySQL 8+。老实说,我选择了一个不同的答案作为正确答案,因为基于我对MySQL的有限知识,我可以理解这个查询,并且在我第一次尝试时,这个查询就成功了。我真的很感谢你的快速回复,并将在以后尝试学习。@bkp你接受的答案不会产生你期望的结果。谢谢你的回答。我不确定我是否做错了什么,但是我复制了你的答案,修改了列名和表名,然后我得到了一个错误。我正在使用Dbeaver,它应该使用MySQL 8+。老实说,我选择了一个不同的答案作为正确答案,因为基于我对MySQL的有限知识,我可以理解这个查询,并且在我第一次尝试时,这个查询就成功了。我真的很感谢您的快速回复,我会尝试在某个时候了解这一点。@bkp您接受的答案不会产生您期望的输出。