我有一张这样的桌子:
名字 | 标签 |
---|---|
国际米兰 | cep |
国际米兰 | a |
国际米兰 | b |
米兰 | a |
米兰 | c |
尤文 | r |
尤文 | cep |
那不勒斯 | h |
那不勒斯 | p |
我需要采用仅不同的名称,如果标签= cep 则采用该名称,否则采用随机名称(可能是第一个,但并不重要)
所以输出应该是这样的:
名字 | 标签 |
---|---|
国际米兰 | cep |
米兰 | a |
尤文 | cep |
那不勒斯 | h |
我使用 row_number() 尝试了不同的方法,例如:
select name, tag
from (
select *,
row_number() over (partition by name order by name) as row_number
from table
) as rows
where tag='cep' or row_number = 1
但这并不能消除一些名称重复,特别是那些存在“cep”但不是分区中第一个的名称(例如 name = juve)
解决方案?
在分区 order by 中使用 case 表达式首先获取 cep 行:
select name, tag
from (
select *,
row_number() over (partition by name
order by case when name = 'cep' then 0 else 1 end, name) as row_number
from table
) as rows
where row_number = 1