在SQL中,当可能有两个不同的观察值时,如何选择唯一的用户id?

在SQL中,当可能有两个不同的观察值时,如何选择唯一的用户id?,sql,unique,union,Sql,Unique,Union,我有一张表格,里面有人的姓名和国籍。一个人可能有双重国籍,但如果他们有美国国籍,我只想为这个人排这一排 例:\ 预期产量 Name Country\ John US\ Jim Germany\ Mark US 提前感谢您的帮助。不存在的: select t.* from tablename t where t.citizenship = 'US' or not exists (select 1 from tablename where name = t.name

我有一张表格,里面有人的姓名和国籍。一个人可能有双重国籍,但如果他们有美国国籍,我只想为这个人排这一排

例:\

预期产量

Name    Country\
John     US\
Jim      Germany\
Mark     US

提前感谢您的帮助。

不存在

select t.* from tablename t
where t.citizenship = 'US'
or not exists (select 1 from tablename where name = t.name and citizenship = 'US')
或者使用
第一个值()
窗口函数:

select distinct name,
       first_value(citizenship) 
       over (partition by name order by case when citizenship = 'US' then 1 else 2 end) citizenship
from tablename
请参阅。
结果:


您可以使用
ROW\u NUMBER()
窗口函数,如下所示:

select *
from (
  select name, citizenship,
    row_number() over(partition by name 
      order by case when citizenship = 'US' then 1 else 2 end, citizenship
    ) as rn
  from t 
) x
where rn = 1
这里有一种味道:

SELECT DISTINCT
    Name,
    Citizenship= CASE WHEN COUNT(CASE WHEN Citizenship = 'US' THEN 1 ELSE 0 END) OVER (PARTITION BY Name) > 1 THEN 'US' ELSE Citizenship END
FROM 
    t

请问您使用的是哪个数据库和版本?它是Teradata中的。我相信最新的版本,如果他们有多个公民身份,但没有一个是美国公民,你想展示什么?在这种情况下,没有这样的人。这是家庭作业吗?没关系,它只是改变了我的回答方式。这是最好的方法。它保证每人一排。我认识有三本护照的人。
select *
from (
  select name, citizenship,
    row_number() over(partition by name 
      order by case when citizenship = 'US' then 1 else 2 end, citizenship
    ) as rn
  from t 
) x
where rn = 1
SELECT DISTINCT
    Name,
    Citizenship= CASE WHEN COUNT(CASE WHEN Citizenship = 'US' THEN 1 ELSE 0 END) OVER (PARTITION BY Name) > 1 THEN 'US' ELSE Citizenship END
FROM 
    t