RedShift: проблема с созданием запроса для добавления и изменения данных в таблице

Всем привет.

У меня есть такая конечная таблица в РедШифт:

CREATE TABLE target.table (
    collect_project_id      BIGINT NOT NULL,
    prompt_type             VARCHAR(20),
    prompt_input_desc       VARCHAR(3000),
    prompt_input_name       VARCHAR(1000),
    no_of_prompt_count      BIGINT,
    prompt_input_value      VARCHAR(100),
    prompt_input_value_id   BIGSERIAL PRIMARY KEY,
    script_id               BIGINT,
    corpuscode              VARCHAR(20),
    min_recordings          VARCHAR(2000),
    max_recordings          VARCHAR(2000),
    recordings_count        VARCHAR(2000),
    lease_duration          VARCHAR(2000),
    date_created            TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(),
    date_updated            TIMESTAMP WITHOUT TIME ZONE,
    CONSTRAINT must_be_unique UNIQUE (prompt_input_value, collect_project_id)

);

То есть я должен добавить запись в таблицу только тогда, когда у меня сочетание двух уникальных параметра - prompt_input_value, collect_project_id.

Для простого PostgreSQL работающий запрос у меня такой:

AWS_DIM_COLLECT_USR_INP_CONF_COPY_DATA_BETWEEN_SOURCE_SCHAME_STATICPROMPTS_AND_TARGET_SCHEMA = ("""
    INSERT INTO target.table AS t (
            collect_project_id,
            prompt_type,
            prompt_input_desc,
            prompt_input_name,
            prompt_input_value,
            script_id,
            corpuscode)
        SELECT s.projectid,
               max(s.prompttype),
               max(el.inputs->>'name') AS name,
               max(el.inputs->>'desc') AS description,
               v.value,
               max(s.scriptid),
               max(s.corpuscode)
        FROM source.table AS s
           CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
           CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
        WHERE
            s.prompttype = 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
        GROUP BY s.projectid, v.value
        ON CONFLICT
            (prompt_input_value, collect_project_id)
        DO UPDATE SET
            (prompt_input_desc, prompt_input_name, date_updated) =
            (EXCLUDED.prompt_input_desc,
            EXCLUDED.prompt_input_name,
            NOW())
        WHERE t.prompt_input_desc != EXCLUDED.prompt_input_desc
            OR t.prompt_input_name != EXCLUDED.prompt_input_name;

И теперь этот запрос мне нужно переделать под RedShift, так как некоторые команды у него отличаются от простого Postre.

Пробую так:

-- target.table   
begin transaction;
-- Update records
UPDATE target.table AS t
SET prompt_input_desc = s.max(el.inputs->>'desc'), prompt_input_name = s.max(el.inputs->>'name'), date_updated = date()       
FROM source.table AS s
    CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
WHERE
    s.prompttype = 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
GROUP BY s.projectid;

-- Insert records
INSERT INTO target.table (
    collect_project_id,
    prompt_type,
    prompt_input_desc,
    prompt_input_name,
    prompt_input_value,
    script_id,
    corpuscode)
SELECT s.projectid,
    max(s.prompttype),
    max(el.inputs->>'name') AS name,
    max(el.inputs->>'desc') AS description,
    v.value,
    max(s.scriptid),
    max(s.corpuscode)
FROM source.table AS s
    CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
    CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
WHERE
    s.prompttype = 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
GROUP BY s.projectid, v.value;

end transaction;

Но тут я не знаю как проверить уникальность двух столцов - prompt_input_value, collect_project_id.


Ответы (0 шт):