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

UJI*_*JIN 0 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  |
+------+----------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

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

+----------+------------+
| group_id | has_apple  |
+----------+------------+
|    1     |    true    |
|    2     |    false   |
|    3     |    true    |
+----------+------------+
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

好的,它有效......我希望它能够很好地概括,以便以我的方式提出更复杂的原始查询。我的问题是:

是否有更好/更薄/更简单的方法来获得相同的结果,也许只使用一个SELECT

Gor*_*off 5

这是一种方法:

select group_id,
       (countif( fruit = 'apple') > 0) as apple_flag
from t
group by group_id
Run Code Online (Sandbox Code Playgroud)