繁体   English   中英

SQL 高级分组和案例语句,这可能吗?

[英]SQL advanced grouping & case statements , is this possible?

我有以下情况

系统 子系统和文件名 文件加载开始时间 文件加载结束时间
Α A1 交易txt 2022-06-19 08:00:00 2022-06-19 08:00:02
Α A2 用户csv 2022-06-19 08:00:02 2022-06-19 08:00:05
Α A2 员工csv 2022-06-19 08:00:05 2022-06-19 08:00:08
Α A1 经理csv 2022-06-19 08:00:08 2022-06-19 08:00:16
Α A3 客户csv 2022-06-19 08:00:01 2022-06-19 08:00:04
伽玛 A1 交易txt 2022-06-19 10:00:48 2022-06-19 10:00:53
伽玛 A2 用户csv 2022-06-19 10:00:53 2022-06-19 10:00:54
伽玛 A2 员工csv 2022-06-19 10:00:27 2022-06-19 10:00:30
伽玛 A1 经理csv 2022-06-19 10:00:11 2022-06-19 10:00:17
伽玛 A3 客户csv 2022-06-19 10:00:13 2022-06-19 10:00:14

我希望能够按系统对汇总统计信息进行分组。 需要的信息是整体何时开始(最早时间),何时结束(最晚时间),以及每个子系统发生所需的时间,以秒为单位。 从上面的示例中,结果应如下所示:

系统 整体系统负载开始时间 整体系统负载结束时间 A1 所用时间 A2 所用时间 A3 所用时间
Α 2022-06-19 08:00:00 2022-06-19 08:00:16 00:00:10 00:00:06 00:00:03
伽玛 2022-06-19 10:00:11 2022-06-19 10:00:54 00:00:11 00:00:04 00:00:01

我找不到在查询中执行此操作的方法,我试图在每列的 select 子句中选择子查询,并在最后由 System. 但这是不可能的,因为我必须使用 select 子句中的子查询中的 case 语句不支持的聚合函数

我的方法是这样的

SELECT System, 
min(StartTime) as 'File Load Start Time',
max(EndTime) as 'File Load End Time', 
CASE WHEN SubSystem LIKE 'A1%' THEN SUM(DATEDIFF(s, min(StartTime), max(EndTime))) Else 0 END AS 'A1 Time Taken',
CASE WHEN SubSystem LIKE 'A2%' THEN SUM(DATEDIFF(s, min(StartTime), max(EndTime))) Else 0 END AS 'A2 Time Taken',
CASE WHEN SubSystem LIKE 'A3%' THEN SUM(DATEDIFF(s, min(StartTime), max(EndTime))) Else 0 END AS 'A3 Time Taken'
FROM TABLE GROUP BY SYSTEM

但这不起作用,因为 case 语句也需要在 group by 子句中,我无法聚合它们

您的原始查询只需稍作调整即可正常工作。 我在工作台上对其进行了测试。 现在可以了。

SELECT System, 
    min(StartTime) as 'File Load Start Time',
    max(EndTime) as 'File Load End Time', 
    sec_to_time(sum( case when substring_index(subsystem,' ',1)='a1' then to_seconds(endtime)-to_seconds(starttime) else 0 end 
    ) )as 'A1 Time Taken',
    sec_to_time(sum( case when substring_index(subsystem,' ',1)='a2' then to_seconds(endtime)-to_seconds(starttime) else 0 end 
    ) )as 'A2 Time Taken',
    sec_to_time(sum( case when substring_index(subsystem,' ',1)='a3' then to_seconds(endtime)-to_seconds(starttime) else 0 end 
    ) )as 'A3 Time Taken'
FROM test  GROUP BY SYSTEM
;

我假设您的子系统是有限的并且不需要动态列(数据透视表/交叉表)。

以下查询应为您提供所需的输出。

SELECT
    system_name AS "System", 
    min(file_load_start_time) AS "Overall System Load Start Time", 
    max(file_load_end_time) AS "Overall System Load End Time",
    (
    SELECT
        sec_to_time(sum(timestampdiff(SECOND, tsl_a1.file_load_start_time, tsl_a1.file_load_end_time)))
    FROM
        t_system_log tsl_a1
    WHERE
        tsl_a1.system_name = tsl.system_name
        AND LEFT(tsl_a1.subsystem_filename,
        2) = 'A1') AS "A1 Time Taken",
    (
    SELECT
        sec_to_time(sum(timestampdiff(SECOND, tsl_a2.file_load_start_time, tsl_a2.file_load_end_time)))
    FROM
        t_system_log tsl_a2
    WHERE
        tsl_a2.system_name = tsl.system_name
        AND LEFT(tsl_a2.subsystem_filename,
        2) = 'A2') AS "A2 Time Taken",
    (
    SELECT
        sec_to_time(sum(timestampdiff(SECOND, tsl_a3.file_load_start_time, tsl_a3.file_load_end_time)))
    FROM
        t_system_log tsl_a3
    WHERE
        tsl_a3.system_name = tsl.system_name
        AND LEFT(tsl_a3.subsystem_filename,
        2) = 'A3') AS "A3 Time Taken"
FROM
    t_system_log tsl
GROUP BY
    system_name;

如果您的子系统是动态的,您应该使用数据透视查询而不是子查询。 子查询也可能会影响性能。

我的小提琴

编辑:将所有子查询转换为内联以提高性能。 也更新了我的小提琴。

更新小提琴

SELECT
    system_name AS "System", 
    min(file_load_start_time) AS "Overall System Load Start Time", 
    max(file_load_end_time) AS "Overall System Load End Time",
    sec_to_time(sum(case when  LEFT(tsl.subsystem_filename, 2) = 'A1' then timestampdiff(SECOND, tsl.file_load_start_time, tsl.file_load_end_time) else 0 end)) as "A1 Time Taken",
    sec_to_time(sum(case when  LEFT(tsl.subsystem_filename, 2) = 'A2' then timestampdiff(SECOND, tsl.file_load_start_time, tsl.file_load_end_time) else 0 end)) as "A2 Time Taken",
    sec_to_time(sum(case when  LEFT(tsl.subsystem_filename, 2) = 'A3' then timestampdiff(SECOND, tsl.file_load_start_time, tsl.file_load_end_time) else 0 end)) as "A3 Time Taken"
FROM
    t_system_log tsl
GROUP BY
    system_name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM