L oop - скопировать выбранные строки в новую таблицу, а затем удалить все совпадающие записи из исходной таблицы - PullRequest
0 голосов
/ 03 августа 2020

У меня есть набор данных, в котором есть три столбца, 2 столбца идентификаторов и 1 столбец данных.

Набор данных имеет 25 уникальных значений для столбца 2 и 24460 уникальных значений для столбца 1. (например, таблица 1 )

Я хочу иметь возможность создать ранжированный список, в котором для каждой записи в столбце 2 у меня есть список записей в столбце 1 на основе самой низкой записи в столбце значений.

Например :

Table1
col_1 | col_2 | value
   1  |   1   |  0.5
   1  |   2   |  0.3
   1  |   3   |  0.98
   2  |   1   |  0.4
   2  |   2   |  0.5
   2  |   3   |  1.9
   3  |   1   |  2
   3  |   2   |  0.1
   3  |   3   |  1.7
   4  |   1   |   2
   4  |   2   |   4
   4  |   3   |   6
...

Это процедура -

Я хочу скопировать данные в новую таблицу (Таблица2), где я выбираю самые низкие значения для каждого уникального идентификатора в столбце 2.

Table2
col_1 | col_2 | value
   2  |   1   |  0.4
   3  |   2   |  0.1
   1  |   3   |  0.98

Затем я хочу удалить все строки из таблицы 1, где значение в table1.col_1 = table2.col1

Table1
col_1 | col_2 | value
   1  |   1   |  0.5    <- DELETE
   1  |   2   |  0.3    <- DELETE
   1  |   3   |  0.98   <- DELETE
   2  |   1   |  0.4    <- DELETE
   2  |   2   |  0.5    <- DELETE
   2  |   3   |  1.9    <- DELETE
   3  |   1   |  2      <- DELETE
   3  |   2   |  0.1    <- DELETE
   3  |   3   |  1.7    <- DELETE
   4  |   1   |   2
   4  |   2   |   4
   4  |   3   |   6
...

, а затем повторить l oop, чтобы назначить следующий набор наименьших значений для каждой записи в столбце_2.

У меня есть следующий код, и он ведет себя не так, как я ожидал.

do $$
declare 
   counter integer := 0;
begin
    while counter <= 3000 loop
    raise notice 'Counter %', counter;
    INSERT INTO table2 SELECT distinct ON (col_2) col_1, col_2 , value FROM table1 ORDER BY col_2, "value" ASC;
    DELETE FROM table1 WHERE (col_1) IN (SELECT col_1 FROM table_2)    ;
    counter = counter + 1;  
   end loop;
end$$;

В конце l oop, поведение, которое я ожидал, заключалось в том, чтобы иметь уникальный список значений для table2.col1 при удалении все записи для table1.col1, основанные на уникальном назначении, происходящем в части кода INSERT.

Однако после запуска кода у меня нет уникального списка - у меня примерно 4000 записей слишком много и есть дубликаты для col_1, что означает, что часть оператора delete не удаляет все значения из таблицы 1, которые имеют совпадающие значения в таблице 2.

Кто-нибудь знает, почему это происходит?

...