我希望你能帮上忙,这给我带来了很多不必要的工作。。。
我有很多用户在每次开始游戏时都会被分配一个唯一的会话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的组合游戏长度一起加入
感谢您的帮助,非常感谢!
1条答案
按热度按时间ymzxtsji1#
根据您的描述,您可以只运行一个查询。但是,我不清楚您是否想要一排:
或每个玩家一行:
编辑:
根据你的评论
JOIN
应该工作: