Sql 当多个规则处于活动状态时,如何使用子查询计算总和?
我正在尝试使用以下规则从以下会话_值表计算val字段的总和:Sql 当多个规则处于活动状态时,如何使用子查询计算总和?,sql,group-by,subquery,distinct,Sql,Group By,Subquery,Distinct,我正在尝试使用以下规则从以下会话_值表计算val字段的总和: 事件字段只能有“开始”和“停止”值 当sessionid同时具有两种事件类型时,“停止”事件的val字段将用于计算。例如,10将用于会话id 1,5将用于会话id 4 如果sessionid只有“开始”或“停止”,则val字段将用于sessionid。例如,sessionid 2的值为6,sessionid 5的值为7 mysql> select * from session_values; +----------------
- 事件字段只能有“开始”和“停止”值
- 当sessionid同时具有两种事件类型时,“停止”事件的val字段将用于计算。例如,10将用于会话id 1,5将用于会话id 4
- 如果sessionid只有“开始”或“停止”,则val字段将用于sessionid。例如,sessionid 2的值为6,sessionid 5的值为7
mysql> select * from session_values; +-------------------------+-----------+-------+------+ | time | sessionid | event | val | +-------------------------+-----------+-------+------+ | 2019-07-24 15:52:24.671 | 1 | start | 5 | | 2019-07-24 15:52:27.730 | 1 | stop | 10 | | 2019-07-24 15:52:30.658 | 2 | stop | 6 | | 2019-07-24 15:52:33.919 | 3 | stop | 8 | | 2019-07-24 15:52:44.671 | 4 | start | 5 | | 2019-07-24 15:52:47.293 | 4 | stop | 5 | | 2019-07-24 16:36:03.097 | 5 | start | 7 | | 2019-07-24 16:36:09.399 | 6 | start | 3 | +-------------------------+-----------+-------+------+
select sum(val) from (
select * from (select * from session_values ) s1
where s1.event in ('start','stop')
group by sessionid
HAVING COUNT(DISTINCT s1.event) = 1
) s2 ;
它按预期工作,返回24小时
以及具有多个事件的sessionid的以下sql:
select sum(val) from (
select * from (select * from session_values ) s1
where s1.event in ('start','stop')
group by sessionid
HAVING COUNT(DISTINCT s1.event) = 2
) s2 ;
我有两个问题:
第一个问题是,我无法找到一种方法来确保第二个SQL只返回“stop”事件(包含多个事件),这意味着在运行以下查询时,我只得到“start”事件。是否可以增强查询以仅返回“停止”事件
select * from (
select * from (select * from session_values ) s1
where s1.event in ('start','stop')
group by sessionid
HAVING COUNT(DISTINCT s1.event) = 2
) s2 ;
+-------------------------+-----------+-------+------+
| time | sessionid | event | val |
+-------------------------+-----------+-------+------+
| 2019-07-24 15:52:24.671 | 1 | start | 5 |
| 2019-07-24 15:52:44.671 | 4 | start | 5 |
+-------------------------+-----------+-------+------+
第二个问题是,我希望结合一个SQL查询,根据解释的规则计算值的总和。是否可以将启动-停止对中的两个SQL事件组合起来
select *
from session_values
where sessionid in (
select sessionId
from session_values
where event in ('start','stop')
group by sessionid
HAVING COUNT(1)=2
)
and event='stop'
和总金额:
select sum(val)
from session_values
where sessionid in (
select sessionId
from session_values
where event in ('start','stop')
group by sessionid
HAVING COUNT(1)=2
)
and event='stop'
or sessionid in (
select sessionId
from session_values
where event in ('start','stop')
group by sessionid
HAVING COUNT(1)=1
)
and event='start'
这正是我所寻找的,除了组合查询(和event='start')的最后一行,该行基于“如果sessionid只有'start'或'stop',则val字段将用于sessionid”的规则。当我按预期删除最后一行时,它起作用了。谢谢你的帮助。