我有一些由date_time、job_name和status列组成的数据.作业(job)可以每天运行一次,也可以每天在不同的时刻运行多次,它们的状态可以是"成功"、"失败"或"禁用".

我的数据是这样的:

date_time job_name status
01/01/2020 07:30:30 job_1 success
01/01/2020 15:30:30 job_1 disabled
01/01/2020 18:30:30 job_1 failed
01/01/2020 08:30:30 job_2 success
01/01/2020 18:30:30 job_2 disabled
01/02/2020 15:30:30 job_1 success
01/02/2020 08:30:30 job_2 success
01/02/2020 18:30:30 job_2 success

我try 按日期(注意,不是日期/时间)和JOB_NAME对这些数据进行分组.根据日期(注意,不是日期/时间),我想返回作业(job)是否成功.

如果某一天作业(job)的一次运行(或唯一一次运行)是"失败"的,则我的分组行必须返回"失败",而不考虑当天的其他"状态"结果.

如果作业(job)在一天中的一个运行(或唯一运行)被"禁用",并且该作业(job)没有"失败"运行,则我的分组行必须返回"已禁用".

如果作业(job)在一天中的所有运行都是"Success",我的分组行必须返回"Success".

因此,我的示例表的预期结果是:

date_time job_name status
01/01/2020 job_1 failed
01/01/2020 job_2 disabled
01/02/2020 job_1 success
01/02/2020 job_2 success

我曾try 在DATE_TIME和JOB_NAME列上使用GROUP BY语句来实现此结果,但我无法实现何时返回"成功"、"失败"和"禁用"状态的逻辑.

如有任何帮助,我们不胜感激!

推荐答案

使用GROUP BYCASE语句以及聚合函数COUNTSUM的组合:

SELECT 
  CONVERT(DATE, date_time) AS date, --to extract only the date portion from the date_time column.
  job_name,
  CASE
    WHEN COUNT(*) = SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) THEN 'failed'
    WHEN SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) > 0 THEN 'failed'
    WHEN SUM(CASE WHEN status = 'disabled' THEN 1 ELSE 0 END) > 0 THEN 'disabled'
    ELSE 'success'
  END AS status
FROM your_table
GROUP BY CONVERT(DATE, date_time), job_name;

dbfiddle DEMO

以下是聚合函数MAX的替代方案:

SELECT 
  CONVERT(DATE, date_time) AS date,
  job_name,
  CASE
    WHEN MAX(CASE WHEN status = 'failed' THEN 2 WHEN status = 'disabled' THEN 1 ELSE 0 END) = 2 THEN 'failed'
    WHEN MAX(CASE WHEN status = 'disabled' THEN 1 ELSE 0 END) = 1 THEN 'disabled'
    ELSE 'success'
  END AS status
FROM your_table
GROUP BY CONVERT(DATE, date_time), job_name;

DBFiddle MAX DEMO

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

无效和不匹配的计数

用于动态查询情况的存储过程常识模式

我可以将INSERT语句与SELECT一起使用来创建条件吗?

值对于类型字符来说太长

如何用客户名称计算sum(dr)和sum(cr)

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

基于另一个(SAS、SQL)中的值更新列

在SQL查询中查找客户端的最短日期比较列和多行

使用左外部联接更正列中第+1行的值时重复

为什么SQL in中的空子查询有时被视为null

确定小数中使用的精度位数

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

查询中获取审批者不起作用

将表格和字符串连接以 for each 记录生成订单项目

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

连接表时避免重复

BigQuery 将一行拆分为多列