#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