Подтвердить что ты не робот

Поиск дубликатов записей в таблице с использованием SQL Server

Я проверяю таблицу, которая имеет данные уровня транзакции сайта электронной коммерции и находит точные ошибки.

Я хочу, чтобы ваша помощь находила дубликаты записей в 50 столбцах таблицы SQL Server.

Предположим, что мои данные:

OrderNo shoppername amountpayed city Item       
1       Sam         10          A    Iphone
1       Sam         10          A    Iphone--->>Duplication to be detected
1       Sam         5           A    Ipod
2       John        20          B    Macbook
3       John        25          B    Macbookair
4       Jack        5           A    Ipod

Предположим, что я использую следующий запрос:

Select shoppername,count(*) as cnt
from dbo.sales
having count(*) > 1
group by shoppername

вернет меня

Sam  2
John 2

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

1       Sam         10          A    Iphone
4b9b3361

Ответ 1

with x as   (select  *,rn = row_number()
            over(PARTITION BY OrderNo,item  order by OrderNo)
            from    #temp1)

select * from x
where rn > 1

вы можете удалить дубликаты, заменив инструкцию select на

delete x where rn > 1

Ответ 2

SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as cnt
FROM dbo.sales
GROUP BY OrderNo, shoppername, amountPayed, city, item
HAVING COUNT(*) > 1

Ответ 3

SQL> SELECT JOB,COUNT(JOB) FROM EMP GROUP BY JOB;

JOB       COUNT(JOB)
--------- ----------
ANALYST            2
CLERK              4
MANAGER            3
PRESIDENT          1
SALESMAN           4

Ответ 4

Просто добавьте все поля в запрос и не забудьте добавить их в Group By.

Select shoppername, a, b, amountpayed, item, count(*) as cnt
from dbo.sales
group by shoppername, a, b, amountpayed, item
having count(*) > 1

Ответ 5

Чтобы получить список нескольких записей, используйте следующую команду

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

Ответ 6

Попробуйте это вместо

SELECT MAX(shoppername), COUNT(*) AS cnt
FROM dbo.sales
GROUP BY CHECKSUM(*)
HAVING COUNT(*) > 1

Сначала прочтите функцию CHECKSUM, так как могут быть дубликаты.

Ответ 7

with x as (
select shoppername,count(shoppername)
              from sales
              having count(shoppername)>1
            group by shoppername)
select t.* from x,win_gp_pin1510 t
where x.shoppername=t.shoppername
order by t.shoppername

Ответ 8

Прежде всего, я сомневаюсь, что результат не точным? Кажется, есть три "Сэм" из оригинальной таблицы. Но это не важно для вопроса.

Тогда мы приходим к самому вопросу. На основе вашей таблицы лучшим способом показать повторяющееся значение является использование предложения count(*) и Group by. Запрос будет выглядеть следующим образом:

SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1

Причина заключается в том, что все столбцы из вашей таблицы однозначно идентифицируют каждую запись, что означает, что записи будут считаться дублирующимися только тогда, когда все значения из каждого столбца будут одинаковыми, также вы хотите показать все поля для дубликатов записей, поэтому Group by не пропустит ни одного столбца, иначе да, потому что вы можете использовать только столбцы select, которые участвуют в разделе "group by".

Теперь я хотел бы привести вам пример для With...Row_Number()Over(...), который использует выражение таблицы вместе с функцией Row_Number.

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

OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A Ipod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A Ipod 2016-06-06

Обратите внимание, что строка # 2 не является дубликатом, если вы все еще принимаете все столбцы как единицу. Но что, если вы хотите рассматривать их как дубликаты, а также в этом случае? Вы должны использовать With...Row_Number()Over(...), и запрос будет выглядеть так:

WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'

Вышеприведенный запрос даст результат вместе с датой доставки, например:

OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2

Обратите внимание, что этот отличается от того, который был с 2016-01-01, и причина, по которой была отфильтрована 2016-02-02, - это PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier, а дата доставки НЕ является одним из столбцов, которые необходимо принять уход за дублирующимися записями, что означает, что один с 2016-02-02 все еще может быть идеальным результатом для вашего вопроса.

Теперь суммируем это немного, использование предложения count(*) и Group by вместе - лучший выбор, когда вы хотите показать все столбцы из предложения Group by в качестве результата, иначе вы пропустите столбцы, которые не участвуют в Group by.

В то время как для With...Row_Number()Over(...) в каждом сценарии подходит для поиска повторяющихся записей, однако немного сложнее написать запрос и немного сконструировать по сравнению с предыдущим.

Если вы хотите удалить повторяющиеся записи из таблицы, вы должны использовать более поздний WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE.

Надеюсь, это поможет!

Ответ 9

Попробуйте это

with T1 AS
(
SELECT LASTNAME, COUNT(1) AS 'COUNT' FROM Employees GROUP BY LastName HAVING  COUNT(1) > 1
)
SELECT E.*,T1.[COUNT] FROM Employees E INNER JOIN T1 ON T1.LastName = E.LastName

Ответ 10

Выберите * от dbo.sales group by shoppername (кол-во) (1)

Ответ 11

Выберите EventID, count() как cnt от dbo.EventInstances group by EventID с count() > 1

Ответ 12

Ниже приведен код:

SELECT abnno, COUNT(abnno)
FROM tbl_Name
GROUP BY abnno
HAVING ( COUNT(abnno) > 1 )