Mysql 根据服务状态在行之间执行操作的查询
我需要一个查询来返回一个服务值的三个操作的平均值,这些值必须按服务分组。问题在于,每个值的返回操作都在表中以与服务的状态(已启动、正在运行、准备就绪)相关的不同行进行组织。值为INT格式,仅具有代表性 下面是我的MySQL数据表示例Mysql 根据服务状态在行之间执行操作的查询,mysql,sql,Mysql,Sql,我需要一个查询来返回一个服务值的三个操作的平均值,这些值必须按服务分组。问题在于,每个值的返回操作都在表中以与服务的状态(已启动、正在运行、准备就绪)相关的不同行进行组织。值为INT格式,仅具有代表性 下面是我的MySQL数据表示例 +---------+------+---------------+------------+----------+----------+ | service | Id | State | value_1 | value_2 | val
+---------+------+---------------+------------+----------+----------+
| service | Id | State | value_1 | value_2 | value_3 |
+---------+------+---------------+------------+----------+----------+
| Civil | 01 | started | 12 | 16 | 28 |
| Civil | 01 | running | 32 | 40 | 42 |
| Civil | 01 | ready | 59 | 61 | 64 |
| Public | 02 | started | 02 | 11 | 12 |
| Public | 02 | running | 13 | 15 | 22 |
| Public | 02 | ready | 29 | 31 | 35 |
| Military| 03 | started | 09 | 11 | 18 |
| Military| 03 | running | 33 | 41 | 44 |
| Military| 03 | ready | 49 | 72 | 74 |
| Public | 04 | started | 12 | 17 | 18 |
| Public | 04 | running | 22 | 23 | 41 |
| Public | 04 | ready | 51 | 53 | 54 |
+---------+------+---------------+------------+----------+----------+
例如,考虑到Id等于01的“公务员”服务,我想要执行的操作是:
- (值_3来自“运行”状态行)-(值_1来自“启动”状态行),这将是:42-12=30
- (就绪状态行的值_2)-(运行状态行的值_3),这将是:61-42=19
- (值_1来自“就绪”状态行)-(值_3来自“已启动”状态行),这将是:59-28=31
+---------+---------+---------+---------+
| service | avg_op1 | avg_op2 | avg_op3 |
+---------+---------+---------+---------+
| Civil | 30 | 19 | 31 |
| Public | 24.5 | 10.5 | 25 |
| Military| 35 | 28 | 31 |
+---------+---------+---------+---------+
考虑到同一Id的服务状态,我最大的困难是在行之间进行操作。使用条件聚合来计算值:
SELECT
service,
AVG(op1) AS avg_op1,
AVG(op2) AS avg_op2,
AVG(op3) AS avg_op3
FROM
(
SELECT
service,
Id,
MAX(CASE WHEN State = 'running' THEN value_3 END) -
MAX(CASE WHEN State = 'started' THEN value_1 END) AS op1,
MAX(CASE WHEN State = 'ready' THEN value_2 END) -
MAX(CASE WHEN State = 'running' THEN value_3 END) AS op2,
MAX(CASE WHEN State = 'ready' THEN value_1 END) -
MAX(CASE WHEN State = 'started' THEN value_3 END) AS op3
FROM yourTable
GROUP BY service, Id
) t
GROUP BY
service;
我无法理解如何通过上面的查询,我们可以保证在具有相同ID的州上执行操作。@JhonataTridapalli我对我最初发布的答案进行了一次修改。我们需要在这里进行两层聚合。首先,我们根据服务和id进行聚合,以获得操作值。然后,我们仅通过服务第二次聚合得出平均值。查看我上面添加的演示链接。如果有值4怎么办?你的意思是说,如果有值4怎么办。你需要使用虚拟语气(是的,虚拟语气在现代英语中仍然存在),但我没心情。