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

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; +----------------

我正在尝试使用以下规则从以下会话_值表计算val字段的总和:

  • 事件字段只能有“开始”和“停止”值
  • 当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 |
    +-------------------------+-----------+-------+------+
    
有关详细信息,请参阅以下url:

我使用以下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 ;
它按预期工作,返回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”的规则。当我按预期删除最后一行时,它起作用了。谢谢你的帮助。