SQL 查询以查找不符合阈值的数据

SQL query to find data that doesn't meet a threshold

我需要找到一个价值组合列表,将机会识别为不存在的组合。我的数据是这样的。

Company Product
A 1
A 2
A 3
B 2
C 1
C 3
D 1
E 2
E 4

我想确定至少有 3 家公司销售的产品,然后告诉没有销售的公司哪些产品很受欢迎。对于此示例,产品 1 和 2 由至少 3 家公司销售。 B公司和E公司没有销售产品1,C公司和D公司没有销售产品2。查询结果如下。

Company Product
B 1
E 1
C 2
D 2

Oracle是数据库,实际行数~1M

您可以汇总并使用 HAVING 子句查找满足阈值的产品,然后使用 PARTITIONed OUTER JOIN 查找 non-matching 行:

SELECT t.company, p.product
FROM   ( SELECT product
         FROM   table_name
         GROUP BY product
         HAVING COUNT(DISTINCT Company) >= 3) p
       LEFT OUTER JOIN table_name t
       PARTITION BY (t.company)
       ON (p.product = t.product)
WHERE  t.product IS NULL

其中,对于您的示例数据:

CREATE TABLE table_name (Company, Product) AS
SELECT 'A', 1 FROM DUAL UNION ALL
SELECT 'A', 2 FROM DUAL UNION ALL
SELECT 'A', 3 FROM DUAL UNION ALL
SELECT 'B', 2 FROM DUAL UNION ALL
SELECT 'C', 1 FROM DUAL UNION ALL
SELECT 'C', 3 FROM DUAL UNION ALL
SELECT 'D', 1 FROM DUAL UNION ALL
SELECT 'E', 2 FROM DUAL UNION ALL
SELECT 'E', 4 FROM DUAL;

输出:

COMPANY PRODUCT
B 1
C 2
D 2
E 1

db<>fiddle here