检查BigQuery中GROUP BY中每个组的条件是否满足

时间:2019-02-26 21:52:03

标签: sql group-by google-bigquery

我有一个看似简单的问题。希望这不是一个骗子,我一直在搜索,但找不到任何特别相似的东西。

我有一个看起来像这样的表:

+------+----------+--------+--------+
|  id  | group_id | fruit  | color  |
|------+----------+--------+--------+
|   1  |    1     | apple  | red    |
|   2  |    1     | orange | orange |
|   3  |    1     | banana | yellow |
|   4  |    2     | kiwi   | golden |
|   5  |    2     | banana | yellow |
|   6  |    3     | orange | orange |
|   7  |    3     | peach  | orange |
|   8  |    3     | grape  | red    |
|   9  |    3     | apple  | green  |
|  10  |    3     | kiwi   | brown  |
+------+----------+--------+--------+

我只想检查每个组是否包含apple水果,从而得到如下表:

+----------+------------+
| group_id | has_apple  |
+----------+------------+
|    1     |    true    |
|    2     |    false   |
|    3     |    true    |
+----------+------------+

一段时间后,我设法获得该结果的唯一方法是通过以下查询:

SELECT group_id, 
       MAX(temp) AS has_apple 
FROM
    (SELECT group_id,
            MAX(IF(fruit='apple',true,false)) OVER (PARTITION BY group_id) AS temp
     FROM t)
GROUP BY group_id

好的,它可以工作...我希望它能很好地概括,以我的方式放置更复杂的原始查询。我的问题是:

是否有更好/更苗条/更容易的方法来获得相同的结果,也许只使用一个SELECT

1 个答案:

答案 0 :(得分:4)

这是一种方法:

select group_id,
       (countif( fruit = 'apple') > 0) as apple_flag
from t
group by group_id