当多个规则处于活动状态时如何计算子查询的总和?

How to calculate sum with subqueries when more than one rules are active?

我正在尝试使用以下规则根据以下 session_values table 计算 val 字段的总和:

详情请参考以下url: http://www.sqlfiddle.com/#!9/23b7a1/4

我使用以下 sql 代码来计算只有一个事件的 sessionid 的总和:

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 ;

按预期工作并且 returned 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 ;

我有两个问题:

第一个问题是,我无法找到一种方法来确保只有 'stop' 个事件将 returned 用于第二个 SQL(具有多个事件)意思当 运行 以下查询时,我只得到 'start' 事件。是否可以将查询增强为仅 return 'stop' 个事件?

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 ?

stop 个启停对事件

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'