Проверьте, выполнено ли условие для каждой группы в GROUP BY в BigQuery - PullRequest
0 голосов
/ 27 февраля 2019

У меня, казалось бы, простой вопрос.Надеюсь, это не дурак, я искал, но не смог найти ничего похожего.

У меня есть таблица, которая выглядит следующим образом:

+------+----------+--------+--------+
|  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 голосов
/ 27 февраля 2019

Вот один из методов:

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