【问题标题】:SQL creating a view with calculated column that adds rowsSQL 创建一个带有添加行的计算列的视图
【发布时间】:2018-05-24 09:49:21
【问题描述】:

我在 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

如何做这样的事情?

【问题讨论】:

  • 您使用的是哪个 DBMS?相应地标记。
  • 你说得对,忘了说。这是 MySQL
  • 请将数据发布为文本而不是图像,手动复制是皇室的痛苦......
  • 考虑处理应用代码中数据显示的问题。

标签: mysql sql calculated-columns sql-view


【解决方案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

如果您想将一行转换为五行,我强烈建议您使用数字表。

【讨论】:

  • 我同样强烈建议使用应用程序代码 ;-)
  • @Strawberry :如果仅用于演示目的,可以。但是,在许多情况下需要在处理之前对数据进行量化。这在很大程度上取决于目的。
  • 好的 - 我还没有遇到这种情况,但期待它。
  • 这看起来确实是一个不错的解决方案,但不幸的是,我无法在此数据库上创建新表,因为它是服务器数据库。我只能创建视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多