我是 MySQL 世界的新手,我被安排在经常使用它的位置。我目前遇到的问题是,我们正在从多个不同的站点接收数据,这些站点包含许多列,例如下面的表 1:
DateTime | Temperature1 | Temperature2 | Temperature3 | Ect.
我们的很多工程师都喜欢将这些数据提取到 Excel 工作表中,更具体地说是数据透视表,以便于操作。我们也有一些程序使用这些数据来生成图表等。这些程序特别要求数据采用以下格式:
日期时间 | p值 | p名称
pValue 是温度列的值,pName 是该值来自的列名。我尝试创建一个简单的 View 来以上述格式重新格式化数据,但没有取得太大的成功。相反,我求助于一个非常长的 View ,如下所示;
SELECT `DateTime` AS `DateTime`,
`Temperature1` AS `pValue`,
'Temperature1' AS `pName`
FROM `table1`
UNION
SELECT `DateTime` AS `DateTime`,
`Temperature2` AS `pValue`,
'Temperature2' AS `pName`
FROM `table1`
然后,代码会针对每个单独的温度列重复自身。它在我们只有少量数据时有效,但随着数据的增加,我们查询的持续时间会减少,这将成为一个相当大的问题。根据我在网上阅读的内容,使用 View 可能不是处理此类大型数据集的方法,尤其是考虑到我无法为其中的任何内容编制索引。我考虑过创建一个触发器来写入数据,因为它被插入到一个新的重新格式化的表中,但我不知道如何开始。
总而言之,我只是在寻找一些关于重新格式化这些数据的最有效方法的指导。触发器会更好地服务于此目的还是我只需要更好的优化 View 。或者有没有我什至没有想到的第三种选择?
最佳答案
不要将温度读数存储为多列。这称为“重复组”,它不是推荐的数据库设计,因为您现在遇到的困难。相反,每行存储一个温度。
您可以在接收仪器数据的表上创建一个触发器,以便它也将多行插入到一个适当组织的表中。
CREATE TRIGGER FixDataInputs AFTER INSERT ON MyRepeatingGroupsTable
FOR EACH ROW
INSERT INTO MyNormalizedTable (DateTime, Temperature, Instrument)
VALUES (NEW.DateTime, NEW.Temperature1, 1),
(NEW.DateTime, NEW.Temperature2, 2),
(NEW.DateTime, NEW.Temperature3, 3),
(NEW.DateTime, NEW.Temperature4, 4);
现在您可以更轻松地查询新表。
关于mysql - 从多列重新格式化 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615701/