【问题标题】:ATHENA/PRESTO complex query with multiple unnested tables具有多个未嵌套表的 ATHENA/PRESTO 复杂查询
【发布时间】:2021-02-01 09:26:35
【问题描述】:

我想在多个表上创建一个联接。 表登录:我想从登录中检索所有数据 表记录:按用户计算每个数据库和每个特定事件类型的 Nb_of_sessions 表会议:计算每个数据库和每个用户的 Nb_of_meetings 实时表:计算每个数据库和每个用户的 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;

但是当我开始尝试将它们放在一起时,似乎我检索到了错误的数据(我只检索了 db 上的数据)并且似乎效率不高。

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

你有什么想法吗?

问候。

【问题讨论】:

    标签: presto amazon-athena unnest


    【解决方案1】:

    最简单的方法是使用with 构造子查询,然后引用它们。

    with parameter参考:

    您可以使用 WITH 来展平嵌套查询,或简化子查询。

    WITH 子句在查询中位于 SELECT 列表之前,并定义一个或 在 SELECT 查询中使用更多子查询。

    每个子查询定义一个临时表,类似于视图定义, 您可以在 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;
    

    【讨论】:

    • 你好@Philipp,我对这个查询有疑问,我想知道如何在我的会议部分检索面试官的名字和姓氏而不是面试官 ID?
    • 我需要知道表格的外观,您从未提供示例数据
    • 谢谢菲利普!其实从会议表来看,面试官都是id。那些 ids = 登录表中的 ids。所以我需要从会议查询中的登录表中检索名字和姓氏,而不是面试官 ID。因为如果我只检索 id,我将更难看出谁是面试官。
    • 这样的? SELECT m.dbid,m.userid AS userid,count(*) as nb_interviews, array_join(array_agg(l.firstname|| ' ' ||l.lastname),',') as interviewer FROM "meetings"."meeting" m JOIN "logins"."login" l on l.id = m.interviewer group by m.dbid,m.userid
    • 祝你的项目好运:)
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多