Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据服务状态在行之间执行操作的查询_Mysql_Sql - Fatal编程技术网

Mysql 根据服务状态在行之间执行操作的查询

Mysql 根据服务状态在行之间执行操作的查询,mysql,sql,Mysql,Sql,我需要一个查询来返回一个服务值的三个操作的平均值,这些值必须按服务分组。问题在于,每个值的返回操作都在表中以与服务的状态(已启动、正在运行、准备就绪)相关的不同行进行组织。值为INT格式,仅具有代表性 下面是我的MySQL数据表示例 +---------+------+---------------+------------+----------+----------+ | service | Id | State | value_1 | value_2 | val

我需要一个查询来返回一个服务值的三个操作的平均值,这些值必须按服务分组。问题在于,每个值的返回操作都在表中以与服务的状态(已启动、正在运行、准备就绪)相关的不同行进行组织。值为INT格式,仅具有代表性

下面是我的MySQL数据表示例


+---------+------+---------------+------------+----------+----------+
| 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
必须对每组Id执行这些操作

操作的结果必须按服务名称分组,返回操作的平均值

+---------+---------+---------+---------+
| 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怎么办。你需要使用虚拟语气(是的,虚拟语气在现代英语中仍然存在),但我没心情。