[英]Combining multiple queries with 4 joins?
我在ti_userevent
数据库中运行了一个查询,该查询结合了用户从多个播放会话中播放 session 长度,而是返回设定时间和日期之间每个播放器的总播放长度(而不是播放器 1 的 4 个会话,它返回 1 并给出我是所有 4 个会话的总播放长度)。
此查询允许我为我在 MetaBase 中查找的数据设置日期和时间范围,并在提供的时间范围内为每个用户返回多个会话的玩家 ID、玩家名称和总播放时长。
这是查询。
SELECT t2.playername,
(EXTRACT(EPOCH
FROM ( MAX(t.local_time) - MIN(t.local_time)) ::INTERVAL)/60)::integer as duration
FROM ti_userevent t
JOIN
(SELECT DISTINCT t2.value as playerName, t2.session_id
FROM ti_userevent t2
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']]
) t2
ON t2.session_id = t.session_id
GROUP BY t2.playername;
示例数据:
User ID User Name Play Length of all sessions
ID1 Name 1 105
ID2 Name 2 215
ID3 Name 3 352
但是,我还想从查询中获得他们的平均 FPS、GPU 和帧性能。 问题是,这些都存储在同一张表中!
为了获得 GPU 的平均性能,我运行了以下命令,这只给出了基于内部版本号的平均性能。
SELECT
session_id
, value::decimal as AvgGpuMs
FROM
ti_userevent
WHERE
context = 'Perf'
AND action = 'GpuMs'
AND session_id IN
(SELECT DISTINCT session_id
FROM
ti_userevent
WHERE
action = 'BuildNum'
and value = {{BuildNum}})
示例数据:
user_id session_id avggpums
ID1 session1 8.2
ID2 session1 8.7
ID3 session1 9.7
对于 AvgFPS 和 AvgFrameMs 性能,我必须运行上面相同的查询。
我想要将 3 个 AvgFPS、AvgFrameMs 和 AvgGPUms 查询组合到第一个 Play session 长度查询中。 我想让它们在第一个查询中都超出时间范围...我已经尝试了几次,但很难让它返回我所追求的数据。
我在 SQL 方面不是最好的,所以我希望这里有人可以帮助我。 感谢你的帮助!
考虑在 session 级别进行条件计算的组合,然后在玩家级别进行平均。 此外,使用 CTE 来提高基础资源之间的可读性。
注意:在定义FPS和帧时进行了假设,可能需要调整。
WITH session_time AS (
SELECT DISTINCT value as playerName
, session_id
FROM ti_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']]
), session_metrics AS (
SELECT session_id
, AVG((CASE WHEN context='Perf' AND action='GpuMs' THEN value END)::decimal) AS GpuMs
, AVG((CASE WHEN context='Perf' AND action='FPS' THEN value END)::decimal) AS FPS
, AVG((CASE WHEN context='Perf' AND action='Frame' THEN value END)::decimal) AS Frame
FROM ti_userevent
WHERE session_id IN
(SELECT session_id
FROM ti_userevent
WHERE action = 'BuildNum'
AND value = {{BuildNum}})
GROUP BY session_id
)
SELECT t.playername
, (EXTRACT(EPOCH FROM (MAX(ue.local_time) - MIN(ue.local_time))::INTERVAL)/60)::integer AS duration
, AVG(m.GpuMs) AS AvgGpuMs
, AVG(m.FPS) AS AvgFPS
, AVG(m.Frame) AS AvgFrame
FROM ti_userevent ue
INNER JOIN session_time t
ON ue.session_id = t.session_id
INNER JOIN session_metrics m
ON ue.session_id = m.session_id
GROUP BY t.playername;
顺便说一句,您的表似乎是一个实体属性值 model (即关键字值对中的行)。 虽然有很多讨论是否这是一个最佳设计,但如上所示,关系规范化 model 中的大多数简单查询在 EAV model 中将变得更加复杂。 在关系框架中,您将有两个用于一对多关系中的用户和会话的表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.