[英]Referencing a column in a sub-query's where clause
我有一个表,其中包含多个会话事件的记录。 每行都是会话中的一个事件,一个会话可以具有同一事件的多个倍数。 这些基本上是游戏环节,每个事件都是回合开始或回合结束。 我的数据看起来像
Session_id | Event_type | Event_Time
1 | round_start | 12:01:00
1 | round_end | 12:02:00
1 | round_start| 12:05:00
1 | round_end | 12:7:00
2 | round_start | 14:11:00
2 | round_end | 14:12:00
3 | round_start| 15:09:00
3 | round_end | 15:13:00
我试图找到平均回合时间。 我尝试了以下SQL
select
RS.session_id,
RS.Event_Time as StartTime,
RE.EndTime,
TIMESTAMPDIFF(MINUTE,RE.EndTime,RS.Event_Time) as duration
from amp_event_mamlaka as RS
left join
(
select session_id, min(event_time) as EndTimd from amp_event_mamlaka
where Event_Type = "Round End" and session_id = RS.session_id and event_time>RS.Event_Time
) RE
on RE.session_id = RS.session_id
问题是我无法在联接表中引用RS.session_id和RS.event_time。
我正在使用MySQL。 关于如何做到这一点的任何建议?
谢谢
我建议您使用相关的子查询来解决这个问题:
select RS.session_id, RS.Event_Time as StartTime,
(select smin(event_time)
from amp_event_mamlaka em
where em.session_id = RS.session_id and
em.Event_Type = 'Round End' and
em.event_time > RS.Event_Time
) as EndTime,
from amp_event_mamlaka RS;
您可以使用子查询来实现时间戳差异:
select RS.*, TIMESTAMPDIFF(MINUTE, EndTime, Event_Time) as duration
from (select RS.session_id, RS.Event_Time as StartTime,
(select min(event_time)
from amp_event_mamlaka em
where em.session_id = RS.session_id and
em.Event_Type = 'Round End' and
em.event_time > RS.Event_Time
) as EndTime
from amp_event_mamlaka RS
) RS
可以将条件保留在Join On
子句中where
而不是将其保留在subquery
where
子句中。 尝试这个。
SELECT RS.session_id,
RS.Event_Time AS StartTime,
RE.EndTime,
Timestampdiff(MINUTE, RE.EndTime, RS.Event_Time) AS duration
FROM amp_event_mamlaka AS RS
LEFT JOIN (SELECT session_id,
Min(event_time) AS EndTimd
FROM amp_event_mamlaka
WHERE Event_Type = "Round End") RE
ON RE.session_id = RS.session_id
AND RE.event_time > RS.Event_Time
与嵌套查询相反,子查询应仅返回一个值。 您的要求是一个示例,您需要从成对的行中获取数据。 子查询仅用于连接线对,而不提供数据。 小提琴
select e1.SessionID, e1.EventType, e1.EventTime, e2.EventType, e2.EventTime, TimeStampDiff( minute, e1.EventTime, e2.EventTime ) Duration
from Events e1
join Events e2
on e2.SessionID = e1.SessionID
and e2.EventType = 'end'
and e2.EventTime =(
select Min( EventTime )
from Events
where SessionID = e1.SessionID
and EventType = 'end'
and EventTime > e1.EventTime )
where e1.EventType = 'start';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.