У меня есть набор данных, в котором есть три столбца, 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.
Кто-нибудь знает, почему это происходит?