如何在分组时使postgres db中的列为空,这使得它成为分组中的hihghes t行

时间:2015-11-26 13:49:25

标签: sql postgresql postgresql-9.3

此表格代表音乐曲目中的艺术家,位置指定艺术家的顺序, join_relation 指定要在艺术家之间插入的文字,例如'& ;”或','创建 artistcredit

table "tracks_artists"
    Column     |  Type   | Modifiers
---------------+---------+-----------
 track_id      | text    | not null
 position      | integer | not null
 name          | text    |
 join_relation | text    |

因此,如果我们在名称

中有这些行
track_id | position | name | join_relation
--------------------------------------------------------------------+--------------
f559fe60-cf21-4019-9395-7bdde3256be1 | 1 | Elec3 |  &
f559fe60-cf21-4019-9395-7bdde3256be1 | 2 | Psynina  | 

artistcredit将是 Elec3& Pysnina

但在某些情况下由于导入数据无效,我们有一个所有行的连接关系的值

track_id | position | name | join_relation
--------------------------------------------------------------------+--------------
f559fe60-cf21-4019-9395-7bdde3256be1 | 1 | Elec3 |  &
f559fe60-cf21-4019-9395-7bdde3256be1 | 2 | Psynina  | ,

即这将给予 Elec3& Pysnina,

但这是错误的,因为最高位置艺术家不应该具有join_relation列的值

如何修复此表,以便任何轨道的最高阶艺术家都将relation_join设置为null。如果它更容易,我不介意在多个阶段这样做。

我正在使用Postgres 9.3.5

更新 根据下面的答案进入分阶段,首先找到问题行

create temp table badjoins as
select t1.* from tracks_artists t1
where 
( t1.join_relation is not null AND t1.join_relation!='')
AND NOT EXISTS 
(
     SELECT 1 FROM tracks_artists t2 WHERE t1.track_id = t2.track_id  
     AND t2.position > t1.position
);

1 个答案:

答案 0 :(得分:1)

也许这个?

UPDATE tracks_artists t1 SET join_relation = NULL WHERE NOT EXISTS (SELECT 1 FROM track_artists t2 WHERE t1.track_id = t2.track_id AND t2.position > t1.position)