我有一张产品表。这些产品具有产品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
答案 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