分组依据并并排移动时间列

Group By and move time columns side by side

我有以下查询 return 是下面的 table。输出显示了我的禁用触发器程序何时开始以及禁用程序何时结束以及启用触发器的相同内容。

不用担心时间问题,这个过程在小数据集上非常快。

select  
    job_ID ,
    PROCEDURE_NAME ,
    CAST(DATE_INSERTED AS TIMESTAMP) AS END_TIME ,
    TRIM(SUBSTR(MESSAGE, -12)) AS MSG,
    STEP_NAME
from CON_FRAMEWORK_LOG;
| JobID |    PROCEDURE_NAME     | END_TIME |      MSG    | STEP_NAME|   
| ----- | --------------------- | -------- | ----------- | -------- |
| 20537| DISABLE_ENABLE_TRIGGERS| 12:55:49 | DISABLE mode| Start|
| 20537| DISABLE_ENABLE_TRIGGERS| 12:55:49 | DISABLE mode| End  |
| 20537| DISABLE_ENABLE_TRIGGERS| 12:56:07 | ENABLE mode | Start|
| 20537| DISABLE_ENABLE_TRIGGERS| 12:56:08 | ENABLE mode | End  |

目标是将查询调整为return以下table:

| JobID |    PROCEDURE_NAME     | START_TIME | END_TIME   |     MSG      |    
| ----- | --------------------- | --------   | ---------- | ------------ | 
| 20537| DISABLE_ENABLE_TRIGGERS| 12:55:49   | 12:55:49   | DISABLE mode | 
| 20537| DISABLE_ENABLE_TRIGGERS| 12:56:07   | 12:56:08   | ENABLE mode  | 

您可以使用条件聚合:

select job_ID, PROCEDURE_NAME ,
       max(case when step_name = 'start' then CAST(DATE_INSERTED AS TIMESTAMP) end) as start_time,
       max(case when step_name = 'end' then CAST(DATE_INSERTED AS TIMESTAMP) end) as end_time,
       TRIM(SUBSTR(MESSAGE, -12)) AS MSG,
       STEP_NAME
from (select fl.*,
             row_number() over (partition by job_id, procedure_name, step_name, TRIM(SUBSTR(MESSAGE, -12)) order by date_inserted) as seqnum
      from CON_FRAMEWORK_LOG fl
     ) fl
group by job_id, procedure_name, step_name,
         TRIM(SUBSTR(MESSAGE, -12)), seqnum