Импорт CSV в postgresql без повторяющихся строк - PullRequest
0 голосов
/ 10 марта 2020

Мой запрос дублирует строки, когда я импортирую файл CSV в таблицу:

+----------+----------------+---------------------+
| fullname | formattedvalue | recordTime          |
+----------+----------------+---------------------+
| text1    | 170.01346      | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text2    | 24.153432536   | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text3    | 3.583432424    | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text1    | 170.01346      | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text2    | 24.153432536   | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text3    | 3.583432424    | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+

И Запрос:

CREATE TEMP TABLE tmp_x
(
"fullname" varchar,
"formattedvalue" double precision,
"recordtime" timestamp
);

COPY tmp_x FROM PROGRAM 'more +1 "D:\MEAS_20200308x.csv"' (FORMAT csv, DELIMITER ',');

--UPDATE tmp_x
--SET    formattedvalue = ROUND( CAST(formattedvalue as numeric), 3 );

insert into meas_kanal select * from (
select x.*
from tmp_x x
left outer join meas_kanal t on t.fullname = x. fullname AND t. recordtime = x. recordtime
where t. fullname is null AND  t. recordtime is null
) as missing;


DROP TABLE tmp_x;

Мой лог c должен проверять наличие дубликатов в cloumn комбинация: fullname + recordtime

Когда я снова запускаю запрос, он снова вставляет те же строки.

Есть идеи, где я не прав?

РЕДАКТИРОВАТЬ 2:

Я пытался и это с той же проблемой:

INSERT INTO meas_kanal
SELECT x.*
FROM tmp_x x
    LEFT OUTER JOIN meas_kanal t ON (t. fullname = x. fullname AND t. recordtime = x. recordtime)
WHERE t.fullname IS NULL AND t. recordtime IS NULL;

РЕДАКТИРОВАТЬ 3: Один больше не удалось.

INSERT INTO meas_kanal
SELECT *
FROM tmp_x
WHERE NOT EXISTS(SELECT * 
                 FROM meas_kanal 
                 WHERE (tmp_x.fullname=meas_kanal.fullname and
                       tmp_x.recordtime=meas_kanal.recordtime)
                 );

Я думаю, что проблема в другом месте.

Редактировать 4: Возможное решение

Кстати, я забыл упомянуть. У меня нет первичного ключа. Теперь я делаю два:

CREATE TEMP TABLE tmp_x
(
"fullname" varchar,
"formattedvalue" double precision,
"recordtime" timestamp,
UNIQUE (fullname, recordtime)
);

И эту вставку:

insert into meas_kanal(fullname, formattedvalue,recordtime) 
    SELECT fullname, formattedvalue,recordtime FROM tmp_x x
ON CONFLICT DO NOTHING;

Пока все работает так, как я ожидал. Я напишу это решение как ответ, если никто не даст лучшего решения.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я делаю два первичных ключа:

CREATE TEMP TABLE tmp_x
(
"fullname" varchar,
"formattedvalue" double precision,
"recordtime" timestamp,
UNIQUE (fullname, recordtime)
);

И эта вставка:

insert into meas_kanal(fullname, formattedvalue,recordtime) 
    SELECT fullname, formattedvalue,recordtime FROM tmp_x x
ON CONFLICT DO NOTHING;

Пока он работает так, как я ожидаю.

0 голосов
/ 10 марта 2020

Вы можете использовать GROUP BY или DISTINCT

Если исходить из результатов текущего запроса с таблицей, которую вы отобразили

INSERT INTO meas_kanal
SELECT DISTINCT x.fullname, x.formattedvalue, x.recordtime
FROM tmp_x x

Обновление 1

На основе в ваших последних комментариях, если вы хотите вставить последнее время записи, используйте GROUP BY

INSERT INTO meas_kanal
SELECT x.fullname, x.formattedvalue, MAX(x.recordtime) recordtime
FROM tmp_x x
GROUP BY x.fullname, x.formattedvalue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...