1

У меня есть таблица 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 имеет в/другой запись /. Есть ли способ, что я могу сделать это в PostgreSQL - или - еще лучше - Sequelize (Javascript ORM для баз данных SQL?)

+0

Если такое дело сделано это было бы лоскутное решение в лучшем случае, потому что ваши данные появляются быть не нормированы. Если кто-то должен был дать вам решение для работы с исправлениями, ему все равно нужно было бы узнать, что выглядит object_state – e4c5

+0

Отсутствуют обычные подозреваемые: определение таблицы и версия Postgres. –

+0

Я взял на себя смелость удалить шум вокруг объекта object_state, который был ортогонален вопросу и только отвлекался. –

ответ

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() происходит работать, потому что text«Неизвестные» сорт после «Женского» и «Мужской». Он также будет работать для boolean (где «Неизвестно» будет NULL) и min() и max() игнорировать NULL значений.

Последнее условие WHERE не является обязательным, но разумно включить его, чтобы избежать пустых обновлений. Может быть упрощено до o.gender <> sub.gender, если указан столбец NOT NULL;

Почему это идеально подходит для использования типа данных uuid?

+0

спасибо. чтобы добавить к этому, я думаю, было бы хорошо переключить «unknown» на NULL, поэтому я бы изменил вторую строку на: 'SET gender = NULLIF (sub.gender, 'Unknown')'? – user3264659

+0

@ user3264659: Да, и оставьте последнюю строку, так как вы хотите обновить * все * строки в этом случае. –