取出重复的 ID 并识别新列

take Duplicated ID's out and Identify a new columns

我加入了 6 table 一起收集我需要的所有信息。 我想要所有的身份证、姓名、生日和种族。 某些 ID 具有 2 个或更多种族,这将导致 ID 重复。 我正在考虑编写一个子查询,或者我可以只使用一个 case 语句,因为我之前尝试过 case 语句并且适用于另一个案例,但我不能在这种情况下应用它。

我有的是:

ID             NAME                  Birthdays                   Ethnicity
4000           Pedram                11/11/1999                  Middle East
4001           Carlos                11/11/1920                  Spanish 
4001           Carlos                11/11/1920                  Native American
4002           Asia                  11/22/1986                  Polish
4002           Asia                  11/22/1986                  Native American
4002           Asia                  11/22/1986                 White/caucassian

我想说如果有任何 Id 重复和种族不同 <> 给我这个:

ID             NAME                  Birthdays                   Ethnicity
4000           Pedram                11/11/1999                  Middle East
4001           Carlos                11/11/1920                  Multiracial
4002           Asia                  11/22/1986                  multiracial 

PS : 种族是不同的 table 我加入了 Person_table PS :为了能够加入种族 table 到 Person_table 我需要加入另外 3 个 table,它们具有可以相互关联的 pr 键。 PS :我试过 CASE WHEN Count (Id) > 1 THEN 'Multiracial' ELSE Ethnicity END AS Ethnicity_2 并将所有种族识别为多种族。

任何帮助或想法将不胜感激。

SELECT
    id, name, Birthdays,
    IIF(COUNT(DISTINCT Ethnicity) > 1, 'Multiracial', MIN(Ethnicity)) as Ethnicity
FROM
    Table
GROUP BY
    id, name, Birthdays

SELECT
    id, name, Birthdays,
    CASE WHEN COUNT(DISTINCT Ethnicity) > 1 THEN 'Multiracial' ELSE MIN(Ethnicity) END as Ethnicity
FROM
    Table
GROUP BY
    id, name, Birthdays

你可以使用这个:

WITH CTE AS
(
    SELECT  *,
            N = COUNT(*) OVER(PARTITION BY ID),
            RN = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Ethnicity)
    FROM dbo.YourTable
)
SELECT  ID,
        NAME,
        Birthdays,
        CASE WHEN N > 1 THEN 'Multiracial' ELSE Ethnicity END Ethnicity
FROM CTE
WHERE RN = 1;

这个可能不是最有效的,但它确实有效。只需将您派生的 table 替换为下面的 t:

SELECT DISTINCT t.id, t.name,
CASE WHEN cnt = 1 THEN ethnicity
ELSE 'Multiracial' END AS ethnicity
FROM t
INNER JOIN
(SELECT id, COUNT(DISTINCT ethnicity) AS cnt
 FROM t
 GROUP BY id) sub
ON t.id = sub.id

此处测试:http://sqlfiddle.com/#!9/7473f/6