无法加入查询

6mw9ycah  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(277)

我希望你能帮上忙,这给我带来了很多不必要的工作。。。
我有很多用户在每次开始游戏时都会被分配一个唯一的会话id。这意味着,如果他们崩溃和/或只是重新启动应用程序,他们可以在一天内获得多个会话id。我希望能够在一个查询中组合所有这些id,而不必手动检查每个id。
首先,我使用下面的查询来获取在特定时间段内玩游戏的用户列表。这给了我他们的用户id,会话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

现在,最难的部分。。。我必须手动输入每个会话的\u id,以获得他们的播放时间与服务器时间的对比。因为每个玩家可以有多个会话id,所以我允许为每个玩家输入多个会话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\u id,我就运行这个查询,它给出了组合session\u id的播放时间。我可以在一个单一的查询中有多达400名玩家,这就像是一个巨大的浪费时间进入数百个会话id的感觉,这就像是一个巨大的浪费时间。我想我可以将第二个查询中的duration语句添加到第一个查询中,并按用户id分组。。。很简单吧?不,我得到一个值0,我不知道为什么。
我的最终目标是运行1个查询,返回玩家名称和游戏的会话id长度。。。或者,最好将所有单个玩家的会话id与id的组合游戏长度一起加入
感谢您的帮助,非常感谢!

ymzxtsji

ymzxtsji1#

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

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;

编辑:
根据你的评论 JOIN 应该工作:

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;

相关问题