Найти дубликаты в sql server

#sql #sql-server #duplicates

#sql #sql-сервер #дубликаты

Вопрос:

У меня есть такая проблема..

 BookId      BookName                                        BookProvider

1                   Angels and deamons                      Amazon
2                   Angels and deamons                      Amazon
3                   Angels and deamons                      Ebay
4                   Tuesdays                                Amazon                  
5                   SQL 101                                 Ebay                    
  

Я хотел бы найти все названия книг, которые идентичны и существуют в более чем одном уникальном BookProvider, как я могу это сделать в SQL-запросе? В этом примере я хотел бы получить записи 1 и 2, поскольку название книги идентично, и его можно найти как на Amazon, так и на ebay.

Комментарии:

1. Вы хотите включить BookProviders в результат?

2. можете ли вы привести пример или более подробную информацию, это неясно

3. Вам все еще нужны строки 1 и 2? Не 3?

Ответ №1:

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

 select  BookName from table
group by BookName
having count(distinct BookProvider)>1
  

Ответ №2:

Это возвращает все книги с несколькими строками для одного и того же BookProvider:

 WITH cte AS
 (
   SELECT *, COUNT(*) OVER (PARTITION BY BookProvider, BookName) AS cnt 
   FROM @BookTable TT
 )
SELECT * 
FROM cte
WHERE cnt > 1;
  

Ответ №3:

Вам нужны целые строки, включая Bookid и BookProviders? Есть вложенный запрос, который возвращает названия книг, которые можно найти в нескольких хранилищах. Объединитесь с этим результатом.

 select t1.*
from tablename t1
join (select BookName from tablename
      group by BookName
      having count(distinct BookProvider) > 1) t2
    on t1.BookName = t2.BookName 
  

Ответ №4:

 DECLARE @BookProvider TABLE(
    Id int
    ,BookName VARCHAR(100)
    ,BookProvider VARCHAR(100)
)

INSERT INTO @BookProvider
VALUES(1, 'Angels and Demons', 'Amazon')
INSERT INTO @BookProvider
VALUES(2, 'Angels and Demons', 'Ebay')
INSERT INTO @BookProvider
VALUES(3, 'Tuesdays', 'Amazon')
INSERT INTO @BookProvider
VALUES(4, 'SQL 101', 'Ebay')

SELECT BookName, COUNT(DISTINCT BookProvider) as Count FROM @BookProvider 
GROUP BY BookName
HAVING COUNT(DISTINCT BookProvider) > 1
  

Результаты:

  ------------------- ------- 
|     BookName      | Count |
 ------------------- ------- 
| Angels and Demons |     2 |
 ------------------- ------- 
  

Ответ №5:

это:

 select count(bookname),bookname from tablename group by bookname having count(bookname)>1
  

Комментарии:

1. Извините, ребята, я допустил ошибку в своем первоначальном вопросе, мне нужно, чтобы он также основывался на уникальных Bookproviders. Я обновил начальный пост..

Ответ №6:

Вы даже можете использовать CTE с разделом, если хотите просмотреть все книги и их количество:

 DECLARE @BookTable TABLE
(
    BookId int,
    BookName varchar(100),
    BookProvider varchar(100)
)

INSERT INTO @BookTable
(
    BookId,
    BookName,
    BookProvider
)
VALUES
(1, 'Angel and Demons', 'Amazon'),
(2, 'Angel and Demons', 'EBay'),
(3, 'Tuesdays','Amazon'),
(4, 'SQL 101', 'Amazon');

WITH BookCte 
AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY TT.BookName ORDER BY TT.BookName) as RowNumber FROM @BookTable TT
)

SELECT * FROM BookCte BC