首页 文章

Oracle - 将每小时数据从行转换为列

提问于
浏览
0

我有一个Oracle表,其中填充了与日期时间相关的数据行 .

EX:

Value     Datetime
-----     ----------------
123       12/08/2018 00:00
456       12/08/2018 01:00
789       12/08/2018 02:00
...       ...
312       12/08/2018 23:00
321       12/09/2018 00:00
...       ...

我需要获取这些数据并按天分组,但不知何故将每小时数据转换为24小时内每小时一列的列 .

EX:

Date          Value(00:00)     Value(01:00)     Value(02:00)     ...     Value(23:00) 
----          ------------     ------------     ------------     ---     ------------
12/08/2018    123              456              789              ...     312
12/09/2018    321              654              987              ...     423
...           ...              ...              ...              ...     ...

查询以这种格式从表中获取数据的最有效方法是什么?如果这个问题已经得到解答,我道歉 . 我在线搜索了一下,但老实说,即使知道正确的关键字来搜索这个答案,我也有点不一致 . 先感谢您 .

2 回答

  • 0

    我试图尽可能简化堆栈溢出的答案 . 我能够使用类似于下面的查询来获取格式化的信息 .

    SELECT date,
           SUM(CASE WHEN EXTRACT(HOUR FROM datetime) >= 0 AND EXTRACT(HOUR FROM datetime) < 1  THEN value ELSE 0 END) as "value(00:00)",
           SUM(CASE WHEN EXTRACT(HOUR FROM datetime) >= 1 AND EXTRACT(HOUR FROM datetime) < 2  THEN value ELSE 0 END) as "value(01:00)",
           SUM(CASE WHEN EXTRACT(HOUR FROM datetime) >= 2 AND EXTRACT(HOUR FROM datetime) < 3  THEN value ELSE 0 END) as "value(02:00)",
                    ...
           FROM (
                SELECT TO_CHAR(datetime,'YYYY-MM-DD') AS date,
                       value,
                       datetime
                FROM table
           )
    GROUP BY date
    
  • 0

    获取行并将其转换为列的过程称为旋转 . 从11g(?)开始,Oracle有 PIVOT 关键字本地执行此操作 . 请注意,Oracle中没有"time"数据类型,因此我在转动之前将它们转换为两位数字符 . 数据透视中必须有一个聚合函数,因此请确保您没有具有相同日期的重复行 .

    select * from (
      select "Value", to_char( "Datetime", 'HH24' ) as dt from table1
    )
    pivot ( max( "Value" ) for ( dt ) in ( '00' AS "hour0", 
        '01' as "hour1", '02' as "hour2" ));
    

    Edit:

    要按天聚合,忽略时间组件,请在内联视图中添加 TRUNCed 列 .

    select * from (
      select "Value", trunc("Datetime") as the_day, 
             to_char( "Datetime", 'HH24' ) as dt from table1
    )
    pivot ( max( "Value" ) for ( dt ) in ( '00', '01', '02' ));
    

    SQL Fiddle 2

相关问题