PostgreSQL:根据条件比较和更改同一列中的值



我有以下形式的数据:

Name   Category  my_value
Ana    A         42
Ana    B         33
Bob    A         33
Bob    B         33
Carla  A         42
Carla  B         33

我希望相同的名称发生以下情况:

  • 当A和B共享相同的值时,A没有与其关联的值(在colmy_alue中(
  • 当A和B不同时,A保持其值,而B没有与之相关的值(在colmy_value中(

我尝试过:

select *,
case when Category = 'A' and Category = 'B' 
then my_value = null
else my_value
end as "Value A (corrected)"
from my_table

显然错了。。。不确定如果值不同,我如何也实现将B设置为null的条件。以及如何通过这里实现一个组来比较相同名称的类别。。。

理想情况下,这是我追求的输出(同一列中的更改,因为其中每个名称都有更多类别,即C、D、e…-只需要更改A和B(

Name   Category  Value
Ana    A         42                      
Ana    B                                 
Bob    A                                 
Bob    B         33                                       
Carla  A         42    
Carla  B                                   

在另一行是A/B赞美的地方加入自己:

select
t1.Name,
t1.Category,
case
when t1.my_value = t2.my_value and t1.Category = 'A' then null
when t1.my_value != t2.my_value and t1.Category = 'B' then null
else t1.my_value
end as my_value
from my_table t1
left join my_table t2 on t2.Name = t1.Name
and t2.Category != t1.Category
and t2.Category in ('A', 'B')
and t1.Category in ('A', 'B')

观看现场演示。

如果t1的类别为"A",t2的类别为为"B",则与t2连接,反之亦然,并且名称相同。

最新更新