mysql - SQL 创建一个带有添加行的计算列的视图
问题描述
我在 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
如何做这样的事情?
解决方案
一旦你有一张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
对于任何要将一行转换为五行的情况,我强烈建议您使用数字表。
推荐阅读
- python - VS Code:相对导入 - 没有名为 x 的模块
- javascript - HTML显示数据为空白时如何使表单保持原位
- python - Python csv.DictWriter 没有将字典写入 writerow 方法
- azure-bot-service - Azure 机器人服务语言本地方言
- node.js - IBM Cloud:使用 AppID 对多个应用程序实例进行身份验证
- datatables - 方向为 RTL 时的数据表滚动器问题
- plugins - 无法右键单击 JMeter 元素
- python - 在google colab中将python版本从3.7降级到3.6
- c++ - 确定最终成绩和平均成绩的课程代码不起作用
- javascript - JavaScript。在使用 toLowerCase 进行比较之前,我需要将字符串转换为相同的大小写