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
子句查找满足阈值的产品,然后使用 PARTITION
ed 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
我需要找到一个价值组合列表,将机会识别为不存在的组合。我的数据是这样的。
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
子句查找满足阈值的产品,然后使用 PARTITION
ed 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