以下是我获得的数据类型的示例(由不同用户收集):
姓名 | 姓 |
---|---|
萌 | 沫沫 |
萌 | 沫沫 |
杰克 | JAJA |
杰克 | 杰基 |
我想知道两个用户何时为同一个名字收集了不同的姓氏。
我想要得到的输出是:
姓名 | 姓 |
---|---|
萌 | 沫沫 |
杰克 | 无效的 |
如果所有用户都收集了相同的,我会看到姓氏,如果有差异,我会看到 NULL。
我尝试搜索互联网,但我无法正确描述我正在搜索的内容。
我尝试使用 CASE 请求,但没有成功。
以下是我获得的数据类型的示例(由不同用户收集):
姓名 | 姓 |
---|---|
萌 | 沫沫 |
萌 | 沫沫 |
杰克 | JAJA |
杰克 | 杰基 |
我想知道两个用户何时为同一个名字收集了不同的姓氏。
我想要得到的输出是:
姓名 | 姓 |
---|---|
萌 | 沫沫 |
杰克 | 无效的 |
如果所有用户都收集了相同的,我会看到姓氏,如果有差异,我会看到 NULL。
我尝试搜索互联网,但我无法正确描述我正在搜索的内容。
我尝试使用 CASE 请求,但没有成功。
这可以使用
COUNT(DISTINCT ...)
. 按 对结果进行分组name
。计算每个名字的不同姓氏。如果计数不同于 1,则将姓氏显示为空,否则显示实际姓氏,例如 usingMAX
,如下所示:您必须应用聚合函数,
surname
因为分组name
仅按。由于您仅在不同计数为 1 时显示它,因此您选择哪个实例并不重要,因为它们都是相同的。MIN
也可以。您可以按 分组
first_name
,然后将MIN
与进行比较MAX
,看看它们是否相同。db<>小提琴
另一种解决方案是使用窗口函数:
该
partition by first_name, last_name
部分将计入 first_name/last_name 组合。如果 cnt > 1 则同一用户的名字和姓氏相同。演示
注意。如果在您的数据集中,您有相同的用户具有两次相同的 first_name 和 last_name 并且一次具有不同的 first_name 和 last_name 的不同部分,它将返回 null ,如下例所示:
结果将是:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1f604e29be13490818f5e1875e8719eb
有很多方法可以做到这一点,但要继续使用您的
CASE
语句方法,您只需要包含一些聚合,类似于以下内容:这是完整的dbfiddle.uk供参考
那里可能还有更有效的方法,但这至少应该为您提供您正在寻找的有限结果。
这是对Andriy 答案的修改。它认为第二列中的 NULL 是不同的:
db<>fiddle在线演示