问题
我需要有条件地过滤一组记录。筛选数据的规则是:按ProductNumber找到重复值,并且这些值需要具备至少两个ProductType(1和5)。
示例
产品
ProductNumber | ProductType | ProductName |
---|---|---|
A-000217 | 1 | stuff 13 |
A-000217 | 5 | stuff 13 |
A-000086 | 5 | stuff 2 |
A-000086 | 5 | stuff 2 |
A-001229 | 1 | stuff 20 |
A-001146 | 5 | stuff 21 |
A-001146 | 1 | stuff 21 |
以下是过滤后的输出结果
产品 (Filtered)
产品编号 | 产品类型 | 产品名称 |
---|---|---|
A-000217 | 1 | 物品 13 |
A-000217 | 5 | 物品 13 |
A-001146 | 5 | 物品 21 |
A-001146 | 1 | 物品 21 |
- 由于两个记录的产品 A-000086 均为类型 5,因此已将其排除。
- 只有一条记录的产品 A-001229 必须被排除。
我尝试了这段代码,但它没有按预期工作。
CREATE TABLE #Product(
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProductNumber] [varchar](60) NOT NULL,
[ProductType] [int] NOT NULL,
[ProductName] [varchar](60) NOT NULL,
PRIMARY KEY(Id)
);
INSERT INTO [#Product]([ProductNumber], [ProductType], [ProductName])
VALUES('A-000217', 1, 'stuff 13')
,('A-000217', 5, 'stuff 13')
,('A-000086', 5, 'stuff 2')
,('A-000086', 5, 'stuff 2')
,('A-001229', 1, 'stuff 20')
,('A-001146', 5, 'stuff 21')
,('A-001146', 1, 'stuff 21')
--Filter data
; WITH CTE AS (
SELECT
ProductNumber
, ProductType
, ProductName
, COUNT(ProductType) OVER(PARTITION BY ProductNumber) AS [RowNumber]
FROM #Product
)
SELECT * FROM CTE WHERE RowNumber > 1
结果:
我的代码有什么问题?或者我该如何实现这种方法?