Oracle - конвертируйте почасовые данные из строк в столбцы - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть таблица Oracle, заполненная строками данных, связанных с datetime.

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 голосов
/ 09 декабря 2018

Процесс взятия строк и превращения их в столбцы называется pivoting .По состоянию на 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" ));

Редактировать:

Для агрегирования подень, игнорируя компонент времени, добавьте столбец 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

0 голосов
/ 09 декабря 2018

Я попытался максимально упростить ответ при переполнении стека.Мне удалось получить информацию, отформатированную с помощью запроса, аналогичного приведенному ниже.

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
...