SQL создает представление с вычисляемым столбцом, который добавляет строки

0

У меня есть таблица в MySQL, которая документирует время начала и окончания конкретного процесса. Это выглядит так:

process_id process_start       process_end         data_1   data_2
         1 2017-12-05 15:21:55 2017-12-05 15:39:48 SD12891  8952020517397180000
         2 2017-12-05 15:40:19 2017-12-05 21:56:10 40001067 8952020017390610000
         3 2017-12-05 21:58:10 2017-12-05 22:04:46 SD12667  89014103279450400000
         4 2017-12-05 22:05:50 2017-12-05 22:08:11 40001067 89014103279450400000

Я хочу создать представление этого БД с новым столбцом, называемым "process_time", который задокументирует час процесса [LEFT (process_start, 13)], но он создаст строку для каждого часа процесса (вверху) то есть он будет создавать новую строку за каждый час между process_start и process_end), и для каждой новой строки все значения в других столбцах должны оставаться неизменными. Таким образом, БД с последнего снимка будет выглядеть так:

process_id process_time  data_1   data_2
         1 2017-12-05 15 SD12891  8952020517397180000
         2 2017-12-05 15 40001067 8952020017390610000
         2 2017-12-05 16 40001067 8952020017390610000
         2 2017-12-05 17 40001067 8952020017390610000
         2 2017-12-05 18 40001067 8952020017390610000
         2 2017-12-05 19 40001067 8952020017390610000
         2 2017-12-05 20 40001067 8952020017390610000
         2 2017-12-05 21 40001067 8952020017390610000
         3 2017-12-05 21 SD12667  89014103279450400000
         3 2017-12-05 22 SD12667  89014103279450400000
         4 2017-12-05 22 40001067 89014103279450400000

Как это сделать?

  • 0
    Какую СУБД вы используете? Отметьте соответственно.
  • 0
    Вы правы, забыли об этом упомянуть. это MySQL
Показать ещё 2 комментария
Теги:
calculated-columns
sql-view

1 ответ

1

Как только у вас есть таблица numbers, это легко...

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0101c14c048f313b69405a77ad62caee

SELECT
  rounded.process_id,
  rounded.process_start,
  rounded.process_end,
  TIMESTAMPADD(HOUR, numbers.id, rounded.process_start_hour)   AS process_hour,
  rounded.data_1,
  rounded.data_2
FROM
(
  SELECT
    *,
    DATE_FORMAT(process_start,'%Y-%m-%d %H:00:00')   process_start_hour,
    DATE_FORMAT(process_end  ,'%Y-%m-%d %H:00:00')   process_end_hour
  FROM
    document
)
  rounded
INNER JOIN
  numbers
    ON numbers.id <= EXTRACT(HOUR FROM TIMEDIFF(process_end_hour, process_start_hour))
ORDER BY
  rounded.process_id,
  numbers.id

Я настоятельно рекомендую таблицу чисел для любого случая, когда вы хотите перевести одну строку в строки строки.

  • 0
    Я также настоятельно рекомендую вместо этого использовать код приложения ;-)
  • 0
    @Strawberry: если это только для презентационных целей, да. Но есть много случаев, когда данные должны быть количественно перед обработкой. Это очень сильно зависит от цели.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню