将列更新为具有相同 ID 的另一行中该列的任何非未知值
Update column to any non-unknown value of the column in another row with the same ID
我有一个 PostgreSQL table,其中一些行是脏的,因为在数据输入点,记录的 gender
是 "unknown",尽管它始终保持不变,由其 object_id
指示,这是对象的唯一标识符。
object_id gender
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Unknown
56665EA256AB3757CDFA6C1CB4334C91 Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Female
因此,我想将我的 table 更新为这样:
object_id gender
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
其中所有 "unknown" 列都被转换为 object_id
在 /some other entry/ 中具有的任何非未知值。有没有办法在 PostgreSQL 中做到这一点 - 或者 - 甚至更好 - Sequelize(Javascript ORM for SQL 数据库?)
问题不完整,所以我假设当前的 Postgres 版本 9.5 和这个 table 定义:
CREATE TABLE object (
object_id uuid PRIMARY KEY -- ideally a UUID
, gender text -- could probably be boolean
-- rest irrelevant
);
那么解决方案可以是:
UPDATE object o
SET gender = sub.gender
FROM (
SELECT object_id, min(gender) AS gender
FROM object
GROUP BY 1
) sub
WHERE o.object_id = sub.object_id
AND o.gender IS DISTINCT FROM sub.gender;
您需要子查询,因为 UPDATE
中不允许直接使用聚合或 window 函数。
聚合函数 min()
恰好起作用,因为 text
'Unknown' 在 'Female' 之后排序 和 'Male'。它也适用于 boolean
(其中 'Unknown' 将是 NULL
),并且 min()
和 max()
忽略 NULL
值。
最后一个 WHERE
条件是可选的,但包含它以避免空更新是明智的。可以简化为 o.gender <> sub.gender
如果列定义为 NOT NULL
;
- How do I (or can I) SELECT DISTINCT on multiple columns?
为什么最好使用数据类型 uuid
?
我有一个 PostgreSQL table,其中一些行是脏的,因为在数据输入点,记录的 gender
是 "unknown",尽管它始终保持不变,由其 object_id
指示,这是对象的唯一标识符。
object_id gender
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Unknown
56665EA256AB3757CDFA6C1CB4334C91 Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Female
因此,我想将我的 table 更新为这样:
object_id gender
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
其中所有 "unknown" 列都被转换为 object_id
在 /some other entry/ 中具有的任何非未知值。有没有办法在 PostgreSQL 中做到这一点 - 或者 - 甚至更好 - Sequelize(Javascript ORM for SQL 数据库?)
问题不完整,所以我假设当前的 Postgres 版本 9.5 和这个 table 定义:
CREATE TABLE object (
object_id uuid PRIMARY KEY -- ideally a UUID
, gender text -- could probably be boolean
-- rest irrelevant
);
那么解决方案可以是:
UPDATE object o
SET gender = sub.gender
FROM (
SELECT object_id, min(gender) AS gender
FROM object
GROUP BY 1
) sub
WHERE o.object_id = sub.object_id
AND o.gender IS DISTINCT FROM sub.gender;
您需要子查询,因为 UPDATE
中不允许直接使用聚合或 window 函数。
聚合函数 min()
恰好起作用,因为 text
'Unknown' 在 'Female' 之后排序 和 'Male'。它也适用于 boolean
(其中 'Unknown' 将是 NULL
),并且 min()
和 max()
忽略 NULL
值。
最后一个 WHERE
条件是可选的,但包含它以避免空更新是明智的。可以简化为 o.gender <> sub.gender
如果列定义为 NOT NULL
;
- How do I (or can I) SELECT DISTINCT on multiple columns?
为什么最好使用数据类型 uuid
?