2015-11-19 5 views
0

Надеюсь, вы можете мне помочь.Удаление дубликатов в SQL Server 2012 путем группировки данных с несколькими правилами

У меня есть таблица данных в базе данных SQL (таблица 1), которая содержит информацию в 5 столбцах (1,2,3,4,5).

Я требую запроса, который выполняет следующие действия:

  • Некоторые из этих строк могут быть продублированы и эти дубликаты должны быть удалены.
  • Некоторые из этих строк могут иметь один и тот же ключ, сгенерированный объединением столбцов 1,2,3, но разными данными в столбцах в 4 и 5. Правило выглядит следующим образом: сохраняйте данные с наибольшим количеством дубликатов, и если есть равное количество дубликатов (один набор дубликатов, т. е. две строки, где 1,2,3 одинаковы, и 4 & 5 отличаются), сохраните последнюю, недавно введенную в систему (то есть верхнюю часть списка DESC).

Например:

1,2,3,4,5

а, а, а, б, б

а, а, а, б, б

a, a, b, c

Здесь мы сохраним только вторую строку - 'a, a, a, b, b', поскольку есть две из этих дублированных строк и одна из других, 'а, а, а, б, в. Если бы существовали две повторяющиеся строки обоих типов данных, мы бы сохранили последнее последнее (a, a, a, b, c).

Я пытаюсь решить эту проблему с помощью комбинации RANK(), ROW_NUMBER() и COUNT() без успеха, поскольку я относительно не знаком с SQL. Я использую комбинацию из следующих потоков:

how to select the most frequently appearing values?

Select first row in each GROUP BY group?

SQL Query Select first rank 1 row From Multiple ranks/Group

Я надеюсь, что это объяснение было ясно.

Спасибо за чтение!

ответ

1

догадка это должно помочь:

with cte as (
select 
    column1, 
    column2, 
    column3, 
    column4, 
    column5, 
    ROW_NUMBER() OVER(PARTITION BY Column1, Column2, Column3, Column4, Column5 ORDER BY Column4 DESC) AS R 
from 
    YourTable 
) 

select * from cte where r = 1 

это путь я всегда удалить мои дубликаты ... надеюсь, что это помогает ...

+0

Спасибо, это удаляет дубликаты, но не отвечает второе правило - если есть два набора повторяющихся строк (т. е. 4 строки, два дублируются), запрос должен выбрать только самую последнюю строку для ввода. Этот скрипт просто выбирает первый в заказе, а не наиболее часто повторяющийся элемент. – stax1001