У меня есть такие табличные данные. И ожидаемый результат:
или
или
Если вставлено 4 записи, то они объединятся и станут 16 (4 * 4) записями в окончательной временной таблице. Как в этом случае удалить ненужные данные?
Это то, что пробовал
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2) AS Row_count
FROM table_1
)
DELETE FROM cte WHERE rn<>1;
И я получил:
что неправильно.
ColB
данные не должны дублироваться.
После удаления каждая запись должна быть уникальной.
Это временные данные. И у него нет первичного ключа. После правильных данных они будут вставлены в другую таблицу. И я не могу внести изменения в эту таблицу, используя оператор Alter. Поэтому я выбрал правильные данные из таблицы Temp.
Все ли строки этой таблицы имеют одинаковое значение 12 в столбце ColC?
Да все то же самое, кроме этих двух столбцов
Вы можете использовать комбинацию двух разделов и проверить различия:
WITH cte AS (
SELECT ColA, ColB, ColC,
ROW_NUMBER() OVER (PARTITION BY ColA ORDER BY ColB) AS Row_count1,
ROW_NUMBER() OVER (PARTITION BY ColB ORDER BY ColA) AS Row_count2
FROM table_1
)
DELETE FROM cte WHERE Row_count1<>Row_count2
См. скрипт db здесь https://dbfiddle.uk/aLsQLHIt
Я бы ранжировал строки дважды: первый раз по colB, colC и по colA, так что промежуточные результаты будут такими:
После этого остается только отфильтровать строки с rank_bc = rank_a
with test_data_ranked as (
select ColA, ColB, ColC,
dense_rank() over (order by colB, colC) rank_bc,
dense_rank() over (order by colA) rank_a
from test_data)
select colA, colB, colC
from test_data_ranked
where rank_bc = rank_a;
Вы можете решить свою проблему с помощью cte и оконной функции, используя хранилище запросов.
;WITH cte AS (
select *,row_number() OVER (PARTITION BY Rw order by ColB ) AS Rwn from (
SELECT *,
row_number() OVER (PARTITION BY ColB order by colA ) AS Rw
FROM Ta
)d
)
delete FROM cte WHERE Rwn>1;
Результат:
Это то, что я тоже получил. Я хочу, чтобы значение ColB было разным для каждой записи. :)
Для этого примера данных все, что вам нужно, это оконная функция DENSE_RANK()
, чтобы получить номер группы для каждого значения ColA
:
WITH cte AS (SELECT *, DENSE_RANK() OVER (ORDER BY ColA) rn FROM t)
DELETE FROM cte WHERE ColB <> rn;
Смотрите демо.
У этой таблицы есть
PRIMARY KEY
? Что такое полное утверждениеCREATE TABLE
и как вы вообще получили эти повторяющиеся данные?