将列更新为具有相同 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