ОБНОВЛЕНИЕ ПОСТГРЕССОВ ПО КОНФЛИКТУ. Ошибка не может повлиять на строку во второй раз (dupes), ТОЛЬКО ПРОИСХОДИТ В ФУНКЦИИ. Не как запрос - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть запрос в функции, которая, похоже, не возвращает дубликатов из моих чеков, и если она запускается как отдельный запрос ... это работает!При запуске в сохраненной функции выдается ошибка. ON CONFLICT DO UPDATE команда не может повлиять на строку во второй раз.

Это не имеет смысла.

CREATE OR REPLACE FUNCTION rollups.compute_daily_rollups_every_hour(
start_time timestamp without time zone,
end_time timestamp without time zone)
RETURNS void
LANGUAGE 'plpgsql'

COST 100
VOLATILE 
AS $BODY$

BEGIN
RAISE NOTICE 'Computing daily rollups from % to % (excluded)', start_time, end_time;

RAISE NOTICE 'Aggregating data into daily_rollup';
EXECUTE $$
    INSERT INTO rollups.daily_rollup
        SELECT 
            COALESCE(visitors, 0) AS visitors, COALESCE(total_dwell_time, 0) AS total_dwell_time, d.datestamp::date,  doorway_id, customer_id, centre_id, postcode, gender, age_group, house_income, no_children, no_cars, shopping_frequency, marital_status, employment_status
        FROM (
            Select date_trunc('day', (current_date - offs)) AS datestamp
            FROM generate_series(0, 365, 1) AS offs
        ) AS D
        LEFT OUTER JOIN (
            SELECT cv.datestamp,
                round((date_part('epoch'::text, sum(cv.dwell_time)) / 60::double precision)::numeric, 2) AS total_dwell_time,
                count(cv.sensor_id) AS visitors,
                cv.doorway_id,
                cv.customer_id,
                cv.centre_id,
                cv.gender,
                cv.postcode,
                cv.age_group,
                cv.no_children,
                cv.no_cars,
                cv.marital_status,
                cv.employment_status,
                cv.shopping_frequency,
                cv.house_income
            FROM rollups.some_rollup cv
            WHERE cv.dwell_time > '00:00:30'::interval
            GROUP BY cv.datestamp, cv.doorway_id, cv.customer_id, cv.centre_id, cv.gender, cv.postcode, cv.age_group, cv.no_children, cv.no_cars, cv.marital_status, cv.employment_status, cv.shopping_frequency, cv.house_income
                ) AS t1
            ON d.datestamp::date = t1.datestamp::date
            WHERE d.datestamp >= $1 AND d.datestamp < $2
            ORDER BY d.datestamp
    ON CONFLICT (datestamp, doorway_id, customer_id, centre_id, gender, postcode, age_group, no_children, no_cars, marital_status, employment_status, shopping_frequency, house_income)
    DO UPDATE SET visitors=excluded.visitors, total_dwell_time = excluded.total_dwell_time;$$
USING start_time, end_time;
END;

$BODY$;
...