改进查询来计算在另一列中具有特定值的不同值的查询

时间:2019-01-26 01:38:32

标签: sql hive

说我有一个表格,格式为:

| id | category|
|----|---------|
| 10 | A       |
| 10 | B       |  
| 10 | C       |
| 2  | C       |

我想计算类别变量中具有三个值A,B和C的不同ID的数量。在这种情况下,查询将返回1,因为仅对于id = 10才为true。

我的直觉是编写以下查询以获取该值:

SELECT 
    COUNT(DISTINCT id), 
    SUM(CASE WHEN category = 'A' THEN 1 else 0 END) AS A,
    SUM(CASE WHEN category = 'B' THEN 1 else 0 END) AS B,
    SUM(CASE WHEN category = 'C' THEN 1 else 0 END) AS C
FROM 
    table 
GROUP BY 
    id
HAVING
    A >= 1
    AND 
    B >= 1
    AND
    C >= 1

但是,这感觉有些过头了-是否有更简单的方法来达到预期的结果?

2 个答案:

答案 0 :(得分:1)

我假设这是一个更大的表的一部分,您的ID和类别可以出现多次,并且由于其他字段而仍然是不同的,并且您知道要查找多少个类别。

SELECT ID, COUNT(ID)
FROM(
SELECT DISTINCT ID, CATEGORY
FROM TABLE)
GROUP BY ID
HAVING COUNT(ID) = 3 --or however many categories you want

此处的子查询会删除无关的信息,并强制您的ID对每个类别显示一次。然后,您可以算出它出现的次数,并查找显示3次或想要多次的次数。

答案 1 :(得分:1)

您很亲密,但是您需要两个聚合级别。假设没有重复的行:

SELECT COUNT(*)
FROM (SELECT id
      FROM t
      WHERE Category IN ('A', 'B', 'C') 
      GROUP BY id
      HAVING COUNT(*) = 3
     ) t;