在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