SQL - 查找多个重复项

时间:2017-09-29 14:15:01

标签: sql sql-server duplicates

我有一张产品表。这些产品具有产品ID。产品ID可以由产品共享。它们由版本ID区分。例如,自行车的id为1.有不同种类的自行车共享p_id为1但v_id为1-15。在表中有许多重复,我想找到它们。我做了一个查询,找到了产品的副本。所以我可以看到产品版本的数量,但有些产品被插入了两次。我写了一个查询来查看产品版本的数量,但现在我想看到所有的重复项。有一个名为product Value(描述)的列,如果它是重复的,则是指示符。

实施例

productKey  productValue    cout
16293   Bike    2
16292   Bike    2
16291   Bike    2
16290   Pads    2
16289   Pads    2
16288   Helmet  3
16286   Shoe    2

从这里你可以看到自行车和护垫出现3次,但是Helmet&鞋只出现一次。我想编辑我的重复查询(或添加到它),这样我就可以获得多次显示的项目(也就是头盔和鞋子不会出现)第三列是版本,但可以忽略。

查询

SELECT productKey, productValue, COUNT(*) as cout
FROM [Store].[dbo].[products]
GROUP BY productKey, productValue
HAVING COUNT(*) > 1
ORDER BY productKey DESC

想要结果,就像这样

productKey  productValue    cout
16293   Bike    2
16292   Bike    2
16291   Bike    2
16290   Pads    2
16289   Pads    2

6 个答案:

答案 0 :(得分:1)

使用Count() Over()窗口聚合函数

Select * from 
(
select *,
       cout = Count(1)over(partition by productValue)
from [Store].[dbo].[products]
) a
Wher cnt > 1

如果您想使用Group By,则需要sub-query

Select * 
from  [Store].[dbo].[products] 
where productValue in (SELECT productValue 
                       FROM [Store].[dbo].[products] 
                       GROUP BY productValue HAVING COUNT(*) > 1) 

答案 1 :(得分:1)

您希望找到两个版本引用相同内容的产品。 (至少这是您的查询所做的。)从这些具有重复版本的产品中,您只想选择产品标题出现在至少两个问题产品中的产品。这似乎没有多大意义,但是你走了:

SELECT productKey, productValue, cout
FROM
(
  SELECT 
    productKey, 
    productValue, 
    COUNT(*) as cout,
    COUNT(*) OVER (PARTITION BY productValue) as cnt
  FROM Store.dbo.products
  GROUP BY productKey, productValue
  HAVING COUNT(*) > 1
) counted
WHERE cnt > 1
ORDER BY productKey DESC;

答案 2 :(得分:0)

You can select duplicate rows in subquery and select them in your main query



  SELECT 
         productKey, productValue,cout
    FROM 
         [Store].[dbo].[products] p1
    WHERE 
         productKey IN( 
               SELECT productKey
               FROM [Store].[dbo].[products]
               GROUP BY productKey, productValue
               HAVING COUNT(*) > 1
               )

答案 3 :(得分:0)

你走了:

DECLARE @T TABLE (productKey INT, productValue VARCHAR(30), cout INT);
INSERT INTO @T VALUES
(16293,   'Bike',  2),
(16292,   'Bike',  2),
(16291,   'Bike',  2),
(16290,   'Pads',  2),
(16289,   'Pads',  2),
(16288,   'Helmet',  3),
(16286,   'Shoe',  2);

SELECT *
FROM @T
WHERE  productValue IN (SELECT productValue FROM (SELECT productValue,COUNT(productValue) N FROM @T GROUP BY productValue) AS T WHERE T.N > 1) ;

结果:

+------------+--------------+------+
| productKey | productValue | cout |
+------------+--------------+------+
|      16293 | Bike         |    2 |
|      16292 | Bike         |    2 |
|      16291 | Bike         |    2 |
|      16290 | Pads         |    2 |
|      16289 | Pads         |    2 |
+------------+--------------+------+

答案 4 :(得分:0)

您真正想要的(根据我现在的理解):重复产品名称,但忽略产品编号中的重复项,因为这些是同一产品的版本,因此当然不会被视为问题。

因此,您正在寻找可以计算多个产品编号的产品名称。请使用COUNT(DISTINCT ProductKey)

select * 
from
(
  select products.*, count(distinct productkey) over (partition by productValue) as cnt
  from products
) counted
where cnt > 1;

答案 5 :(得分:0)

请尝试以下SQL Query,以帮助您获得结果:

;WITH CTE
     AS (
     SELECT productKey,
            productValue,
            COUNT(*) OVER(PARTITION BY productValue) AS ActualCnt
     FROM products
     GROUP BY productKey,
              productValue)
     SELECT T.productKey,
            T.productValue,
            T.cout
     FROM CTE C
          INNER JOIN products T ON T.productValue = C.productValue
     WHERE C.ActualCnt > 1
     GROUP BY T.productKey,
              T.productValue,
              T.cout;

期望输出:

productKey  productValue   cout
----------- ------------- -------
16289       Pads           2
16290       Pads           2
16291       Bike           2
16292       Bike           2
16293       Bike           2