Как получить не сгруппированные столбцы в операторе SQL (аналогично MySQL) - PullRequest
0 голосов
/ 19 февраля 2019

В MySQL я могу выполнить следующий запрос:

select first_name from `table` group by age

enter image description here

Однако, если я сделаю что-то подобное в BigQuery, я получуследующая ошибка:

SELECT список выражений ссылается на столбец first_name, который не группируется и не агрегируется

Как бы мы написали эквивалентный запрос агрегации mysql в BigQuery?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

В BigQuery вы должны использовать оконные функции:

select t.*
from (select t.*, row_number() over (partition by age order by age) as seqnum
      from t
     ) t
where seqnum = 1;

Это работает и в MySQL 8+.

0 голосов
/ 20 февраля 2019

Ниже для стандартного SQL BigQuery и так просто, как показано ниже

#standardSQL
SELECT ANY_VALUE(first_name) first_name
FROM `project.dataset.table`
GROUP BY age

Как вы можете видеть, вам не хватало только функции агрегирования - она ​​может быть любой - MAX, MIN и т. Д. Я выбрал ANY_VALUEв качестве примера

Вы можете проверить, поиграть с выше, используя некоторые упрощенные фиктивные данные, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Thomas' first_name, 25 age UNION ALL
  SELECT 'Mike', 25 UNION ALL
  SELECT 'Thomas', 30 UNION ALL
  SELECT 'Mark', 40
)
SELECT ANY_VALUE(first_name) first_name
FROM `project.dataset.table`
GROUP BY age

с результатом

Row first_name   
1   Thomas   
2   Thomas   
3   Mark     
0 голосов
/ 19 февраля 2019

вы должны поместить все выбранные столбцы в group by также

 select first_name, last_name from 
`table` group by age,first_name, last_name

кстати до версии 8.0 mysql это было разрешено, но с 8.0 это не разрешено

но у васВ запросе отсутствует агрегатная функция, поэтому вы можете использовать вместо

select distinct first_name, last_name from 
    `table`
разные группы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...