Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据日期和条件获取最早的唯一行_Mysql - Fatal编程技术网

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
查询需要执行以下操作:

  • 检查每个电子邮件地址的最早标记

  • 如果最早的标记与tag1或tag2匹配,则将其包含在结果中

  • 结果中没有重复的电子邮件地址
  • 例如,上述数据集上该查询的结果将是:

    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您接受的答案不会产生您期望的输出。