首页 > 解决方案 > 无法加入查询

问题描述

我希望你能帮助解决这个问题,它为我创造了很多不必要的工作......

我有很多用户在每次开始游戏时都被分配了一个唯一的 session_id。这意味着如果他们崩溃和/或只是重新启动应用程序,他们可以在一天内获得多个 session_id 。我希望能够将所有这些 id 组合在一个查询中,而不必手动检查每一个。

首先,我使用下面的查询来获取在某个时间范围内玩过游戏的用户列表。这给了我他们的 user_id, session_id 作为 PlayerName

SELECT
      user_id
    , session_id
    , value as PlayerName
FROM 
    bi_userevent
WHERE 
        context = 'Player'
    AND action = 'Name'
    [[AND local_time >= {{StartTime}}::timestamp at time zone 'US/Pacific']]
    [[AND local_time < {{EndTime}}::timestamp at time zone 'US/Pacific']]
GROUP BY 1,2,3
ORDER BY PlayerName

    SAMPLE DATA (From query above)
user_id          session_id           playername
4234hjh2342      asjd7a7yf978as       Player 1
4234hjh2342      asjd7a7yf978as       Player 1
f872j23hasd      52354294khjhjh       Player 2
9as90d09asd      zf87fsd08s7das       Player 3
9as90d09asd      80asd7g90asd7g       Player 3
9as90d09asd      aga90786e9a0f6       Player 3

现在,最难的部分...我必须手动输入每个 session_id 以获取他们的游戏时间与服务器时间。由于每个玩家可以有多个 session_id,我允许为每个玩家输入多个 session_id(作为元数据库中的变量)。

SELECT          
    (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM bi_userevent     
WHERE 
    session_id = {{session_id}}
    [[OR session_id = {{session_id2}}]]
    [[OR session_id = {{session_id3}}]]
    [[OR session_id = {{session_id4}}]]

输入 session_id 后,我运行查询,它为我提供了组合 session_id 的播放时间。我可以在一个查询中拥有多达 400 名玩家,输入数百个会话 ID 感觉就像是在浪费大量时间,感觉就像在浪费大量时间。我以为我可以将第二个查询中的持续时间语句添加到第一个查询中并按 user_id 分组...简单吧?不,我得到的值为 0,我不知道为什么。

我的最终目标是运行 1 次查询,返回玩家姓名和 session_id 游戏长度......或者,更好的是加入所有单个玩家会话 id 以及 id 的组合播放长度

感谢您的任何帮助,非常感谢!

标签: mysqlsqlpostgresqlmetabase

解决方案


根据您的描述,您可以只运行一个查询。但是,我不清楚你是否想要一行:

SELECT (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM  sr_userevent
WHERE context = 'Player' AND
      action = 'Name'
      [[AND local_time >= {{StartTime}}::timestamp at time zone 'US/Pacific']]
      [[AND local_time < {{EndTime}}::timestamp at time zone 'US/Pacific']];

或者每个玩家一行:

SELECT value as playername, 
       (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM  sr_userevent
WHERE context = 'Player' AND
      action = 'Name'
      [[AND local_time >= {{StartTime}}::timestamp at time zone 'US/Pacific']]
      [[AND local_time < {{EndTime}}::timestamp at time zone 'US/Pacific']]
GROUP BY value;

编辑:

根据您的评论, aJOIN应该可以工作:

SELECT s2.playername, 
       (EXTRACT(EPOCH FROM ( MAX(s.local_time) - MIN(s.local_time)) ::INTERVAL)/60)::integer as duration             
FROM sr_userevent s JOIN
     (SELECT DISTINCT s2.value as playerName, s2.session_id
      FROM sr_user_event s2
      WHERE context = 'Player' AND
            action = 'Name'
            [[AND local_time >= {{StartTime}}::timestamp at time zone 'US/Pacific']]
            [[AND local_time < {{EndTime}}::timestamp at time zone 'US/Pacific']]
    ) s2
    ON s2.session_id = s.session_id
GROUP BY s2.playername;

推荐阅读