#presto #amazon-athena #unnest
#presto #amazon-athena #unnest
Вопрос:
я хотел бы создать объединение для нескольких таблиц. вход в таблицу: я хотел бы получить все данные из таблицы входа в систему ведение журнала: вычисление Nb_of_sessions для каждой базы данных и для каждого определенного типа события по пользовательской таблице встреча: вычисление Nb_of_meetings для каждой базы данных и для каждой пользовательской таблицы live: вычисление Nb_of_live для каждой базы данных и для каждого пользователя
У меня есть эти запросы с правильными результатами :
SELECT db.id,_id as userid,firstname,lastname
FROM "logins"."login",
UNNEST(dbs) AS a1 (db)
SELECT dbid,userid,count(distinct(sessionid)) as no_of_visits,
array_join(array_agg(value.from_url),',') as from_url
FROM "loggings"."logging"
where event='url_event'
group by db.id,userid;
SELECT dbid,userid AS userid,count(*) as nb_interviews,
array_join(array_agg(interviewer),',') as interviewer
FROM "meetings"."meeting"
group by dbid,userid;
SELECT dbid,r1.user._id AS userid,count(_id) as nb_chat
FROM "lives"."live",
UNNEST(users) AS r1 (user)
group by dbid,r1.user._id;
Но когда я начинаю пытаться собрать все это вместе, кажется, что я извлекаю неверные данные (у меня есть только извлеченные из базы данных), и это кажется неэффективным.
select a1.db.id,a._id as userid,a.firstname,a.lastname,count(rl._id) as nb_chat
FROM
"logins"."login" a,
"loggings"."logging" b,
"meetings"."meeting" c,
"lives"."live" d,
UNNEST(dbs) AS a1 (db),
UNNEST(users) AS r1 (user)
where a._id = b.userid AND a._id = c.userid AND a._id = r1.user._id
group by 1,2,3,4
У вас есть идея ?
С уважением.
Ответ №1:
Самый простой способ — работать со with
структурой подзапроса, а затем ссылаться на них.
Вы можете использовать WITH для сглаживания вложенных запросов или упрощения подзапросов.
Предложение WITH предшествует списку ВЫБОРА в запросе и определяет один или несколько подзапросов для использования в запросе ВЫБОРА.
Каждый подзапрос определяет временную таблицу, аналогичную определению представления, на которую вы можете ссылаться в предложении FROM . Таблицы используются только при выполнении запроса.
Поскольку у вас уже есть рабочие подзапросы, должно работать следующее:
with logins as
(
SELECT db.id,_id as userid,firstname,lastname
FROM "logins"."login",
UNNEST(dbs) AS a1 (db)
)
,visits as
(
SELECT dbid,userid,count(distinct(sessionid)) as no_of_visits,
array_join(array_agg(value.from_url),',') as from_url
FROM "loggings"."logging"
where event='url_event'
group by db.id,userid
)
,meetings as
(
SELECT dbid,userid AS userid,count(*) as nb_interviews,
array_join(array_agg(interviewer),',') as interviewer
FROM "meetings"."meeting"
group by dbid,userid
)
,chats as
(
SELECT dbid,r1.user._id AS userid,count(_id) as nb_chat
FROM "lives"."live",
UNNEST(users) AS r1 (user)
group by dbid,r1.user._id
)
select *
from logins l
left join visits v
on l.dbid = v.dbid
and l.userid = v.userid
left join meetings m
on l.dbid = m.dbid
and l.userid = m.userid
left join chats c
on l.dbid = c.dbid
and l.userid = c.userid;