Удалить повторяющуюся запись на сервере sql

КолА ColB ColC А 1 12 А 2 12 А 3 12 Б 1 12 Б 2 12 Б 3 12 С 1 12 С 2 12 С 3 12

У меня есть такие табличные данные. И ожидаемый результат:

КолА ColB ColC А 1 12 Б 2 12 С 3 12

или

КолА ColB ColC А 3 12 Б 2 12 С 1 12

или

КолА ColB ColC А 1 12 Б 3 12 С 2 12

Если вставлено 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 ColC А 1 12 Б 1 12 С 1 12

что неправильно.

ColB данные не должны дублироваться. После удаления каждая запись должна быть уникальной.

У этой таблицы есть PRIMARY KEY? Что такое полное утверждение CREATE TABLE и как вы вообще получили эти повторяющиеся данные?

Dai 20.04.2023 10:17

Это временные данные. И у него нет первичного ключа. После правильных данных они будут вставлены в другую таблицу. И я не могу внести изменения в эту таблицу, используя оператор Alter. Поэтому я выбрал правильные данные из таблицы Temp.

Early Bird 20.04.2023 10:20

Все ли строки этой таблицы имеют одинаковое значение 12 в столбце ColC?

forpas 20.04.2023 10:49

Да все то же самое, кроме этих двух столбцов

Early Bird 20.04.2023 11:24
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
133
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать комбинацию двух разделов и проверить различия:

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, так что промежуточные результаты будут такими:

КолА ColB ColC rank_bc ранг_а А 1 12 1 1 А 2 12 2 1 А 3 12 3 1 Б 3 12 3 2 Б 2 12 2 2 Б 1 12 1 2 С 1 12 1 3 С 2 12 2 3 С 3 12 3 3

После этого остается только отфильтровать строки с 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 ColC А 1 12 Б 1 12 С 1 12

Это то, что я тоже получил. Я хочу, чтобы значение ColB было разным для каждой записи. :)

Early Bird 20.04.2023 12:17

Для этого примера данных все, что вам нужно, это оконная функция DENSE_RANK(), чтобы получить номер группы для каждого значения ColA:

WITH cte AS (SELECT *, DENSE_RANK() OVER (ORDER BY ColA) rn FROM t)
DELETE FROM cte WHERE ColB <> rn;

Смотрите демо.

Другие вопросы по теме

Необязательные отношения один к одному в entitiy framework не приводят к правильному внешнему первичному ключу в моей базе данных sql
Обновление существующих полей данными из другого поля в той же строке и данными из другой таблицы — SQL Server 2019
SQL-запрос для извлечения чисел перед определенным словом, включая числа с плавающей запятой
Как создать глобальную временную таблицу в одной хранимой процедуре и использовать ее в другой хранимой процедуре
Как сделать каскад на колонке?
Ошибка «Значение типа «Целое число» не может быть преобразовано в Output0Buffer» в DataFlowTask в Visual Studio Professional 2017
Установите уникальное значение для первого дубликата и значение по умолчанию для последующих дубликатов того же номера
Как настроить «репликацию таблиц» между двумя базами данных SQL Azure без каких-либо внешних компонентов или служб?
Как сделать запрос продолжения, который правильно разбивается на страницы с условиями включения?
EF Core 7: BulkInsertOrUpdateAsync переопределяет значения ограничений по умолчанию неверными значениями