根据另一列选择要采用的不同值 - PostgresSQL

问题描述 投票:0回答:1

我有一张这样的桌子:

名字 标签
国际米兰 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)

解决方案?

sql distinct partition
1个回答
0
投票

在分区 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
© www.soinside.com 2019 - 2024. All rights reserved.