当多个规则处于活动状态时如何计算子查询的总和?
How to calculate sum with subqueries when more than one rules are active?
我正在尝试使用以下规则根据以下 session_values table 计算 val 字段的总和:
- 事件字段只能有 'start' 和 'stop' 值
- 当sessionid同时具有两种事件类型时,将使用'stop'事件的val字段进行计算。例如,10 将用于 sessionid 1,5 将用于 session id 4
如果sessionid只有'start'或者'stop',sessionid会使用val字段。比如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:
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'
我正在尝试使用以下规则根据以下 session_values table 计算 val 字段的总和:
- 事件字段只能有 'start' 和 'stop' 值
- 当sessionid同时具有两种事件类型时,将使用'stop'事件的val字段进行计算。例如,10 将用于 sessionid 1,5 将用于 session id 4
如果sessionid只有'start'或者'stop',sessionid会使用val字段。比如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: 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'