我如何在Oracle SQL 19中透视

丹尼尔·李

我在Oracle SQL 19中具有下表:

+---------+-----------+---------------------+
| job_num | job_stage |      timestamp      |
+---------+-----------+---------------------+
| job_1   | waiting   | 2020-01-28 11:51:00 |
| job_1   | waiting   | 2020-01-28 11:52:00 |
| job_1   | waiting   | 2020-01-28 11:53:00 |
| job_1   | running   | 2020-01-28 11:54:00 |
| job_1   | running   | 2020-01-28 11:55:00 |
| job_1   | running   | 2020-01-28 11:56:00 |
| job_1   | running   | 2020-01-28 11:57:00 |
| job_1   | finishing | 2020-01-28 11:58:00 |
| job_1   | finishing | 2020-01-28 11:59:00 |
| job_2   | waiting   | 2020-01-28 11:52:00 |
| job_2   | waiting   | 2020-01-28 11:53:00 |
| job_2   | waiting   | 2020-01-28 11:54:00 |
| job_2   | waiting   | 2020-01-28 11:55:00 |
| job_2   | waiting   | 2020-01-28 11:56:00 |
| job_2   | running   | 2020-01-28 11:57:00 |
| job_2   | running   | 2020-01-28 11:58:00 |
| job_2   | running   | 2020-01-28 11:59:00 |
| job_2   | running   | 2020-01-28 12:00:00 |
| job_2   | finishing | 2020-01-28 12:01:00 |
| job_2   | finishing | 2020-01-28 12:02:00 |
| job_2   | finishing | 2020-01-28 12:03:00 |
| job_2   | finishing | 2020-01-28 12:04:00 |
+---------+-----------+---------------------+

我想通过以下方式进行透视:

+---------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| job_num |     min_waiting     |     max_waiting     |     min_running     |     max_running     |    min_finishing    |    max_finishing    |
+---------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| job_1   | 2020-01-28 11:51:00 | 2020-01-28 11:53:00 | 2020-01-28 11:54:00 | 2020-01-28 11:57:00 | 2020-01-28 11:58:00 | 2020-01-28 11:59:00 |
| job_2   | 2020-01-28 11:52:00 | 2020-01-28 11:56:00 | 2020-01-28 11:57:00 | 2020-01-28 12:00:00 | 2020-01-28 12:01:00 | 2020-01-28 12:04:00 |
+---------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+

更具体地说,对于每个job_num,对于每个job_stage,我想要获得最小时间戳和最大时间戳。然后,我想显示每个的最小和最大时间戳job_num

有人可以告诉我如何在Oracle SQL 19中有效地做到这一点吗?任何帮助将不胜感激!

我在SQL中提供以下表格供您参考:

未透视表如下:

with t1 as (
            select 'job_1' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:51', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:52', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:53', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:54', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:55', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:56', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:57', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 11:58', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_1' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 11:59', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:52', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:53', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:54', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:55', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'waiting' as job_stage
                   , to_date('1/28/2020 11:56', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:57', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:58', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 11:59', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'running' as job_stage
                   , to_date('1/28/2020 12:00', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 12:01', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 12:02', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 12:03', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
            union
            select 'job_2' as job_num
                   , 'finishing' as job_stage
                   , to_date('1/28/2020 12:04', 'MM/DD/YYYY HH24:MI') as timestamp
                   from dual
                )
select *
from t1
order by job_num
, timestamp

数据透视表如下:

with t1 as (
            select 'job_1' as job_num
                   , to_date('1/28/2020 11:51', 'MM/DD/YYYY HH24:MI') as min_waiting
                   , to_date('1/28/2020 11:53', 'MM/DD/YYYY HH24:MI') as max_waiting
                   , to_date('1/28/2020 11:54', 'MM/DD/YYYY HH24:MI') as min_running
                   , to_date('1/28/2020 11:57', 'MM/DD/YYYY HH24:MI') as max_running
                   , to_date('1/28/2020 11:58', 'MM/DD/YYYY HH24:MI') as min_finishing
                   , to_date('1/28/2020 11:59', 'MM/DD/YYYY HH24:MI') as max_finishing                   
                   from dual
            union
            select 'job_2' as job_num
                   , to_date('1/28/2020 11:52', 'MM/DD/YYYY HH24:MI') as min_waiting
                   , to_date('1/28/2020 11:56', 'MM/DD/YYYY HH24:MI') as max_waiting
                   , to_date('1/28/2020 11:57', 'MM/DD/YYYY HH24:MI') as min_running
                   , to_date('1/28/2020 12:00', 'MM/DD/YYYY HH24:MI') as max_running
                   , to_date('1/28/2020 12:01', 'MM/DD/YYYY HH24:MI') as min_finishing
                   , to_date('1/28/2020 12:04', 'MM/DD/YYYY HH24:MI') as max_finishing                   
                   from dual
                )
select *
from t1
order by job_num
MT0
SELECT *
FROM   table_name
PIVOT(
  MIN( "TIMESTAMP" ) AS min,
  MAX( "TIMESTAMP" ) AS max
  FOR job_stage IN (
    'waiting' AS waiting,
    'running' AS running,
    'finishing' AS finishing
  )
)

要么:

SELECT job_num,
       MIN( CASE job_stage WHEN 'waiting' THEN "TIMESTAMP" END ) AS waiting_min,
       MAX( CASE job_stage WHEN 'waiting' THEN "TIMESTAMP" END ) AS waiting_max,
       MIN( CASE job_stage WHEN 'running' THEN "TIMESTAMP" END ) AS running_min,
       MAX( CASE job_stage WHEN 'running' THEN "TIMESTAMP" END ) AS running_max,
       MIN( CASE job_stage WHEN 'finishing' THEN "TIMESTAMP" END ) AS finishing_min,
       MAX( CASE job_stage WHEN 'finishing' THEN "TIMESTAMP" END ) AS finishing_max
FROM   table_name
GROUP BY job_num

对于您的样本数据,这两个都输出:

JOB_NUM | WAITING_MIN | WAITING_MAX | RUNNING_MIN | RUNNING_MAX | FINISHING_MIN | FINISHING_MAX       
:------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ 
job_2 | 2020-01-28 11:52:00 | 2020-01-28 11:56:00 | 2020-01-28 11:57:00 | 2020-01-28 12:00:00 | 2020-01-28 12:01:00 | 2020-01-28 12:04:00 
job_1 | 2020-01-28 11:51:00 | 2020-01-28 11:53:00 | 2020-01-28 11:54:00 | 2020-01-28 11:57:00 | 2020-01-28 11:58:00 | 2020-01-28 11:59:00

db <>在这里拨弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 SQL 中透视

来自分类Dev

Oracle中的SQL透视查询

来自分类Dev

我该如何在Oracle中编写SQL?

来自分类Dev

如何在 SQL 中透视此表

来自分类Dev

如何在SQL中取消透视?(SAP HANA)(从列到行)

来自分类Dev

如何在SQL Server中透视两列?

来自分类Dev

如何在SQL Server中应用数据透视

来自分类Dev

如何在SQL SERVER中更新数据透视表

来自分类Dev

如何在SQL Server中按条件透视数据组?

来自分类Dev

如何在 SQL 中透视输出表的单列?

来自分类Dev

我不知道如何在 sql oracle pentaho cde 中删除重复的行

来自分类Dev

如何在Oracle SQL中遍历表

来自分类Dev

EXISTS如何在oracle SQL中工作?

来自分类Dev

如何在Oracle SQL中显示索引

来自分类Dev

如何在 sql (oracle) 中操作 VARRAYS?

来自分类Dev

如何在Oracle PLSQL中透视表?

来自分类Dev

我可以在SQL中制作数据透视表吗

来自分类Dev

Oracle SQL:透视列

来自分类Dev

在 SQL 中透视数据

来自分类Dev

在 sql 中透视表

来自分类Dev

在 sql 查询中透视

来自分类Dev

在 SQL 中透视表

来自分类Dev

Teradata 中的 SQL 透视

来自分类Dev

如何透视SQL Server 2008+中的行数

来自分类Dev

Oracle SQL:如何为子查询中的数据透视表调用创建的列(别名)

来自分类Dev

我如何在 Oracle 中回滚

来自分类Dev

如何在MS Access SQL中编写我的SQL代码?

来自分类Dev

如何在Oracle SQL中更新作业中的参数

来自分类Dev

如何在SQL Server中透视未知的列数且没有聚合?