将列更新为具有相同ID的另一行中列的任何非未知值

时间:2016-07-12 01:39:25

标签: sql postgresql sql-update sequelize.js greatest-n-per-group

我有一个PostgreSQL表,其中一些行是脏的,因为在数据输入时,记录的gender是"未知"虽然它始终保持与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 是对象的唯一标识符。

object_id                           gender
511E1AC7128EE2E74349896B55461F27    Male
511E1AC7128EE2E74349896B55461F27    Male
511E1AC7128EE2E74349896B55461F27    Male
56665EA256AB3757CDFA6C1CB4334C91    Female
56665EA256AB3757CDFA6C1CB4334C91    Female
56665EA256AB3757CDFA6C1CB4334C91    Female
56665EA256AB3757CDFA6C1CB4334C91    Female
55C3BFDBD327396E912604D6E635D59B    Female
55C3BFDBD327396E912604D6E635D59B    Female
55C3BFDBD327396E912604D6E635D59B    Female

因此,我想将我的表更新为:

object_id

其中所有&#34;未知&#34;列被转换为<pre> /其他条目/中的任何非未知值。有没有办法在PostgreSQL中做到这一点 - 或者 - 甚至更好 - Sequelize(SQL数据库的Javascript ORM?)

1 个答案:

答案 0 :(得分:0)

问题不完整所以我假设当前的Postgres版本9.5和此表定义:

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中不允许使用聚合或窗口函数。

汇总函数min()恰好起作用,因为{em>'女性'和'男性'后text '未知'排序。它也适用于boolean(其中“未知”为NULL),min()max()忽略NULL值。

最后一个WHERE条件是可选的,但包含它以避免空更新是明智的。如果列定义为o.gender <> sub.gender;

,则可以简化为NOT NULL

为什么使用数据类型uuid

是理想的