BigQuery — ВЫБЕРИТЕ список ссылок на выражение столбца user_pseudo_id, который не сгруппирован и не агрегирован

# #sql #google-bigquery

Вопрос:

Я пытаюсь объединить два запроса СЛЕВА, которые группируются по идентификатору пользователя из двух таблиц, которые выглядят следующим образом:

t1: number_of_user_sessions

идентификатор пользователя
Джон
Джон
Брайан

t1: количество поисков

идентификатор пользователя
Джон
Брайан
Брайан
Брайан

с возвращением запроса

идентификатор пользователя number_of_user_sessions число поисков
Джон 2 1
Брайан 1 3
 SELECT user_id , COUNT( user_id ) as num_sessions FROM t1
LEFT JOIN (
SELECT user_id, COUNT(user_id) as num_search FROM t2
ON t1.user_pseudo_id = t2.user_pseudo_id
GROUP BY user_id  ORDER BY COUNT(user_id) DESC
 

но продолжайте попадать в SELECT list expression references column user_pseudo_id which is neither grouped nor aggregated ошибку. Есть какие-нибудь идеи о том, что случилось?

Ответ №1:

вот как вы можете это сделать :

 select user_id,num_sessions,num_search
from (
select user_id , count(*) num_sessions
from t1
group by user_id 
) t1
left join (
select user_id , count(*) num_search
from t2
group by user_id 
) t2 on t1.user_id = t2.user_id
 

Ответ №2:

Вы также можете сделать это с помощью агрегации и union all :

 select user_id, sum(is_session) as num_sessions, sum(is_search) as num_searches
from ((select user_id, 1 as is_session, 0 as is_search
       from number_of_user_sessions
      ) union all
      (select user_id, 0, 1
       from number_of_searches
      )
     ) u
group by user_id;
 

Или эквивалентно как:

 select user_id, countif(which = 'session') as num_sessions, 
       countif(which = 'search') as num_searches
from ((select user_id, 'session' as which
       from number_of_user_sessions
      ) union all
      (select user_id, 'search'
       from number_of_searches
      )
     ) u
group by user_id;
 

Ответ №3:

В вашем коде есть небольшая проблема. Я введу правильную форму вашего кода ниже.

 SELECT t1.user_id,COUNT(t1.user_id) as num_sessions,temp.num_search
FROM t1
LEFT JOIN (
SELECT user_id, COUNT(user_id) as num_search FROM t2
GROUP BY user_id) temp
ON t1.user_id= temp.user_id
GROUP BY t1.user_id,temp.num_search
ORDER BY COUNT(t1.user_id) DESC
 

Комментарии:

1. это возвращает новую ошибку SELECT list expression references temp.num_search which is neither grouped nor aggregated a