SQL - 通过条件选择的键获取唯一值

SQL - Get unique values by key selected by condition

我想清理一个数据集,因为有不应该存在的重复键。虽然密钥重复了,但其他字段确实发生了变化。重复时,我想保留那些 country 字段不为空的条目。让我们看一个简单的例子:

|  email  | country |
| 1@x.com |  null   |
| 1@x.com |   PT    |
| 2@x.com |   SP    |
| 2@x.com |   PT    |
| 3@x.com |  null   |
| 3@x.com |  null   |
| 4@x.com |   UK    |
| 5@x.com |  null   |

电子邮件作为关键字,国家/地区是我要过滤的字段。关于电子邮件重复:

  1. 检索国家不为空的条目(案例1)
  2. 如果有多个条目的国家/地区不为空,则检索其中一个,为简单起见,第一个出现(情况 2)
  3. 如果所有条目的国家/地区都为空,同样,只检索其中一个(案例 3)
  4. 如果entry key不重复,不管是哪个国家,直接取回即可(情况4和5)

预期的输出应该是:

|  email  | country |
| 1@x.com |   PT    |
| 2@x.com |   SP    |
| 3@x.com |  null   |
| 4@x.com |   UK    |
| 5@x.com |  null   |

我考虑过使用 UNION 或某种类型的 JOIN 来实现这一点。一种可能是查询:

SELECT
...
FROM (
   SELECT *
   FROM `myproject.mydataset.mytable`
   WHERE country IS NOT NULL
) AS a
...

然后将其与完整的 table 匹配以添加缺少的值,但我无法想象这种方式,因为我对 SQL 的经验有限。

此外,我已经阅读了有关 COALESCE 函数的信息,我认为它可能对任务有所帮助。

考虑以下方法

select *
from `myproject.mydataset.mytable`
where true 
qualify row_number() over(partition by email order by country nulls last) = 1