Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 非常复杂的SQL查询_Mysql_Sql - Fatal编程技术网

Mysql 非常复杂的SQL查询

Mysql 非常复杂的SQL查询,mysql,sql,Mysql,Sql,我正在使用MySql,应该创建一个显示事件状态的非常复杂的报告 例如: event_id | state | create_time ---------------------------------------------------- 1 | PENDING | 2019-04-21 12:55:59.312 1 | COMPLETED | 2019-04-21 12:55:59.339 2 |

我正在使用MySql,应该创建一个显示事件状态的非常复杂的报告

例如:

event_id   |  state        |  create_time
----------------------------------------------------
1          |    PENDING    | 2019-04-21 12:55:59.312
1          |   COMPLETED   | 2019-04-21 12:55:59.339
2          |   PENDING     | 2019-04-21 11:40:21.699
3          |   PENDING     | 2019-04-21 11:40:21.699
3          |   FAILED      | 2019-04-21 11:40:21.600
3          |   COMPLETED   | 2019-04-21 11:40:21.578

我需要根据州偏好选择行:

失败+完成+挂起->失败 已完成+挂起->已完成 单独挂起->挂起 应使用偏移量和大小对其进行分页

每个事件将显示一次

预期结果:

event_id   |  state        |  create_time
----------------------------------------------------
1          |   COMPLETED   | 2019-04-21 12:55:59.339
2          |   PENDING     | 2019-04-21 11:40:21.699
3          |   FAILED      | 2019-04-21 11:40:21.600
如何在单个SQL查询中实现这一点

问候,,
Ido

我怀疑您希望使用一些条件逻辑进行聚合,例如:

select event_id,
       (case when sum(state = 'FAILED') > 0 then 'FAILED'
             when sum(state = 'COMPLETED') > 0 then 'COMPLETED'
             when sum(state = 'PENDING') > 0 then 'PENDING'
        end) as new_state
from t
group by event_id;

您可以使用coalesce进行聚合:


另一个选项是将这些状态首选项作为位掩码处理

注 此方法假定事件id没有重复的统计信息

质疑

结果


请参见

请显示您想要的结果。例如,我不知道你所说的失败+完成+挂起->失败是什么意思。添加的预期结果是你的表结构一成不变的吗?如果对另一个存储每个状态及其优先级的字典记录的表使用一个整数FK,而不是该表上的状态名称,则使用该值会容易得多。否。。简单的桌子。PK是事件id和状态。我发布了一个答案,我认为它应该有效。哦。。。这不起作用,始终优先选择已完成-可能是因为A、B、C。即使我按create_Time订购,如果已完成应首先确定优先级,则您需要更改您的问题。您的问题显示无法优先于已完成状态。。。失败+完成+挂起->失败我更喜欢失败。。。但是查询更倾向于完成!这是天才。
select event_id,
       coalesce(max(case when state = 'FAILED' then 'FAILED' end),
                max(case when state = 'COMPLETED' then 'COMPLETED' end),
                'PENDING'     
               )
from table t
group by event_id;
SELECT 
 t.*
FROM (

SELECT 
   t.event_id
 , SUM(bitmask_table.bitmask) AS total_bitmask
FROM (
  SELECT
    DISTINCT 
       state
     , CASE 
        WHEN state = 'PENDING'
        THEN 2

        WHEN state = 'COMPLETED'
        THEN 4

        WHEN state = 'FAILED'
        THEN 8
       END AS bitmask
  FROM
   t 
) AS bitmask_table
INNER JOIN 
 t
ON
 t.state = bitmask_table.state
GROUP BY 
 t.event_id

) AS group_bitmasked
INNER JOIN 
 t
ON
  group_bitmasked.event_id = t.event_id
AND
 t.state = CASE
    WHEN group_bitmasked.total_bitmask & 8 AND group_bitmasked.total_bitmask & 4 AND  group_bitmasked.total_bitmask & 2
    THEN 'FAILED'

    WHEN group_bitmasked.total_bitmask & 4 AND group_bitmasked.total_bitmask & 2
    THEN 'COMPLETED'  

    WHEN group_bitmasked.total_bitmask & 2
    THEN 'PENDING'      
   END
| event_id | state     | create_time             |
| -------- | --------- | ----------------------- |
| 1        | COMPLETED | 2019-04-21 12:55:59.339 |
| 2        | PENDING   | 2019-04-21 11:40:21.699 |
| 3        | FAILED    | 2019-04-21 11:40:21.600 |