如何根据Email列唯一值筛选Customers表中的Id?
解决筛选唯一Email对应Id的问题
嘿,我来帮你搞定这个SQL需求!首先咱们先看看你原来的语句为啥没达到预期:
你写的select distinct id, email from customers group by id,其实GROUP BY id是按唯一的Id分组,而每个Id本来就对应唯一一行数据,所以这个语句和直接select id, email from customers没啥区别,根本没处理重复的Email,自然得不到你想要的结果。
接下来给你两种靠谱的解法,都能得到你预期的[1,2,3,5]:
方法一:分组+聚合函数(适用于所有主流数据库)
因为你需要每个唯一Email对应的其中一个Id(这里你选了重复Email里最小的Id),所以可以用GROUP BY Email配合MIN(Id)来实现:
SELECT MIN(Id) AS Id FROM customers GROUP BY Email
这个语句的逻辑是:把相同Email的行归为一组,然后从每组里取出最小的Id,这样就得到了每个唯一Email对应的Id,正好符合你的预期结果。如果需要同时显示Email的话,也可以加上Email字段:
SELECT MIN(Id) AS Id, Email FROM customers GROUP BY Email
方法二:窗口函数(适用于支持窗口函数的数据库,比如MySQL 8+、PostgreSQL、SQL Server等)
如果你的数据库支持窗口函数,用ROW_NUMBER()会更灵活,比如你想按其他规则选Id(比如最新的Id)也很容易改:
SELECT Id FROM ( SELECT Id, Email, -- 按Email分组,每组内按Id排序,给每行标序号 ROW_NUMBER() OVER (PARTITION BY Email ORDER BY Id) AS rn FROM customers ) t -- 只取每组的第一行(也就是Id最小的那行) WHERE rn = 1
这两种方法都能帮你得到想要的结果,你可以根据自己的数据库版本和需求选择合适的写法~
内容的提问来源于stack exchange,提问作者spirito_libero
相关产品推荐
相关产品推荐

