无法加入查询
Unable to join queries
我希望你能帮忙解决这个问题,它给我带来了很多不必要的工作...
我有很多用户每次开始游戏时都会分配到一个唯一的 session_id。这意味着他们可以在一天内获得多个 session_id 如果他们崩溃 and/or 只需重新启动应用程序。我希望能够将所有这些 ID 合并到一个查询中,而不必手动检查每个 ID。
首先,我使用下面的查询来获取在特定时间范围内玩过游戏的用户列表。这给了我他们的 user_id, session_id as 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(作为 Metabase 中的变量)。
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 查询,return 玩家姓名和 session_id 游戏时长...或者,最好加入所有单个玩家会话 ID连同 id 的总播放长度
感谢您的所有帮助,非常感谢!
根据您的描述,您可以 运行 一次查询。但是,我不清楚你是否想要一行:
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;
我希望你能帮忙解决这个问题,它给我带来了很多不必要的工作...
我有很多用户每次开始游戏时都会分配到一个唯一的 session_id。这意味着他们可以在一天内获得多个 session_id 如果他们崩溃 and/or 只需重新启动应用程序。我希望能够将所有这些 ID 合并到一个查询中,而不必手动检查每个 ID。
首先,我使用下面的查询来获取在特定时间范围内玩过游戏的用户列表。这给了我他们的 user_id, session_id as 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(作为 Metabase 中的变量)。
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 查询,return 玩家姓名和 session_id 游戏时长...或者,最好加入所有单个玩家会话 ID连同 id 的总播放长度
感谢您的所有帮助,非常感谢!
根据您的描述,您可以 运行 一次查询。但是,我不清楚你是否想要一行:
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;