Problem
我需要有条件地筛选一组记录.过滤数据的规则是:通过ProductNumber查找重复值,并且它们至少需要有两个ProductType(1和5)

Example
产品

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

这应该是输出

产品(已过滤)

ProductNumber ProductType ProductName
A-000217 1 stuff 13
A-000217 5 stuff 13
A-001146 5 stuff 21
A-001146 1 stuff 21
  • 产品A-000086已被排除,因为两个记录都是类型5.
  • 产品A-001229只有1条记录,因此必须将其排除.

我try 了这个代码,但它没有像预期的那样工作.

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

结果:

output

我的代码有什么问题?或者,我如何才能实现这种方法?

推荐答案

CTE中的GROUP BY,每个产品编号的总数为HAVING,DISTINCT类型的结果也是您要搜索的结果

WITH CTE AS
(SELECT
[ProductNumber], [ProductName]
FROM 
[#Product]
GROUP BY [ProductNumber], [ProductName] 
HAVING COUNT(*) > 1 AND COUNT(DISTINCT [ProductType]) > 1)
SELECT p1.[ProductNumber], p1.[ProductType], p1.[ProductName] 
FROM [#Product] p1 JOIN CTE p2 ON p1.[ProductNumber] = p2.[ProductNumber]
ProductNumber | ProductType | ProductName
:------------ | ----------: | :----------
A-000217      |           1 | stuff 13   
A-000217      |           5 | stuff 13   
A-001146      |           5 | stuff 21   
A-001146      |           1 | stuff 21   

db<>fiddle 100

Sql相关问答推荐

SQL查询以条件空值跟踪生产操作结果进展

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

删除MariaDB数据库中的JSON数据

数据库索引:如何使用名称和类别对项目进行最佳索引?

雅典娜嵌套Json提取液

无法将发票与产品价格相关联

带日期函数的复合索引不允许只扫描索引吗?

在WHERE EXISTS子查询中,列返回是否重要?

将SQL Server查询改进为;线程安全;

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

根据标识符将两行合并为一行

MySQL中的递归查询邻接表深度优先?

编写查询以根据级别 (p2) 返回父位置

将有效数字作为 varchar 返回的 SQL 函数

BigQuery Pivot 遗漏行

如何 Select 一列具有最小值而另一列具有给定值的记录?

如何从 2 个 SQLite 表构建嵌套对象?

SQL查询以获取从特定可变日期看到的用户

具有关联统计信息 N+1 的 Rails 6 索引资源?

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用