如何解决根据时间戳和布尔值在SQL表中合并两行
出于“历史性”原因,我有下表:
CREATE TABLE IF NOT EXISTS `measurement`
(
`measureID` int NOT NULL AUTO_INCREMENT,`terraID` int NOT NULL,`pinID` int NOT NULL,`time` timestamp NOT NULL,`value` float NULL,`temperature` boolean NOT NULL,PRIMARY KEY (`measureID`),KEY `measure_terraID_FK` (`terraID`),KEY `measure_pinID_FK` (`pinID`),CONSTRAINT `measure_terraID_reference` FOREIGN KEY `measure_terraID_FK` (`terraID`) REFERENCES `terrarium` (`terraID`),CONSTRAINT `measure_pinID_reference` FOREIGN KEY `measure_pinID_FK` (`pinID`) REFERENCES `pins` (`pinID`)
) ENGINE=INNODB COLLATE=utf8mb4_unicode_ci;
| measureID | terraID | pinID | time | value | temperature |
|:----------|---------|-------|---------------------|--------|------------:|
| 1 | 1 | 9 | 2020-04-10 13:00:01 | 34.3 | 0 |
| 2 | 1 | 9 | 2020-04-10 13:00:01 | 26.5 | 1 |
| 3 | 2 | 10 | 2020-04-10 13:00:01 | 35.1 | 0 |
| 4 | 2 | 10 | 2020-04-10 13:00:01 | 32.9 | 1 |
| 5 | 1 | 9 | 2020-04-10 13:05:01 | 34.4 | 0 |
| 6 | 1 | 9 | 2020-04-10 13:05:01 | 26.6 | 1 |
| 7 | 2 | 10 | 2020-04-10 13:05:01 | 35 | 0 |
| 8 | 2 | 10 | 2020-04-10 13:05:01 | 33 | 1 |
[...]
| 38087 | 2 | 10 | 2020-08-31 12:50:02 | 35.9 | 0 |
| 38088 | 2 | 10 | 2020-08-31 12:50:02 | 35 | 1 |
| 38089 | 1 | 11 | 2020-08-31 12:50:02 | 25.187 | 1 |
| 38090 | 2 | 12 | 2020-08-31 12:50:02 | 28.312 | 1 |
| 38091 | 2 | 10 | 2020-08-31 12:55:01 | 35.8 | 0 |
| 38092 | 2 | 10 | 2020-08-31 12:55:01 | 35 | 1 |
| 38093 | 1 | 11 | 2020-08-31 12:55:01 | 25.25 | 1 |
| 38094 | 2 | 12 | 2020-08-31 12:55:01 | 28.375 | 1 |
,并希望根据时间和pinID将其插入到新表中,以便最终表如下所示:
CREATE TABLE IF NOT EXISTS `measurement`
(
`measureID` int NOT NULL AUTO_INCREMENT,`temperature` float NULL,`humidity` float NULL,CONSTRAINT `measure_pinID_reference` FOREIGN KEY `measure_pinID_FK` (`pinID`) REFERENCES `pins` (`pinID`)
) ENGINE=INNODB COLLATE=utf8mb4_unicode_ci;
| measureID | terraID | pinID | time | temperature | humidity |
|:----------|---------|-------|---------------------|--------------|---------:|
| 2 | 1 | 9 | 2020-04-10 13:00:01 | 26.5 | 34.3 |
| 4 | 2 | 10 | 2020-04-10 13:00:01 | 32.9 | 35.1 |
| 6 | 1 | 9 | 2020-04-10 13:05:01 | 26.6 | 34.4 |
| 8 | 2 | 10 | 2020-04-10 13:05:01 | 33 | 35 |
[...]
| 38088 | 2 | 10 | 2020-08-31 12:50:02 | 35 | 35.9 |
| 38089 | 1 | 11 | 2020-08-31 12:50:02 | 25.187 | NULL |
| 38090 | 2 | 12 | 2020-08-31 12:50:02 | 28.312 | NULL |
| 38092 | 2 | 10 | 2020-08-31 12:55:01 | 35 | 35.8 |
| 38093 | 1 | 11 | 2020-08-31 12:55:01 | 25.25 | NULL |
| 38094 | 2 | 12 | 2020-08-31 12:55:01 | 28.375 | NULL |
我的SQL版本是mariadb-10.3
我不想丢失任何值,也不必关心温度列,因为它是读取值时的旧标识符。但是我想修改所有旧条目以转换为新结构。 但是您可以在IF(温度= 1,值,NULL)作为温度,IF(温度= 0,值,'')作为湿度或某种程度上使用它。
terraID和pinID被键入其他表,并非所有传感器都提供温度和湿度。
我在选择子奎尔魔术中插入一些东西没有运气……也许我太笨了,无法解决问题。
您能否引导我使用正确的功能。这只是一次触发的手动工作。
解决方法
如果我正确地跟随您,则可以使用条件聚合:
select
min(measureID),terraID,pinID,time,max(case when temperature = 1 then value end) value,max(case when temperature = 0 then value end) humidity
from mytable
group by terraID,time
order by min(measureID)
如果需要,您可以轻松地将其转换为insert
查询(使用insert ... select ...
)甚至是create table
语句(create table newtable as ...
)。
measureID | terraID | pinID | time | value | humidity --------: | ------: | ----: | :------------------ | -----: | -------: 2 | 1 | 9 | 2020-04-10 13:00:01 | 26.500 | 34.300 4 | 2 | 10 | 2020-04-10 13:00:01 | 32.900 | 35.100 6 | 1 | 9 | 2020-04-10 13:05:01 | 26.600 | 34.400 8 | 2 | 10 | 2020-04-10 13:05:01 | 33.000 | 35.000 38088 | 2 | 10 | 2020-08-31 12:50:02 | 35.000 | 35.900 38089 | 1 | 11 | 2020-08-31 12:50:02 | 25.187 | null 38090 | 2 | 12 | 2020-08-31 12:50:02 | 28.312 | null 38092 | 2 | 10 | 2020-08-31 12:55:01 | 35.000 | 35.800 38093 | 1 | 11 | 2020-08-31 12:55:01 | 25.250 | null 38094 | 2 | 12 | 2020-08-31 12:55:01 | 28.375 | null,
使用LEAD()
窗口功能:
INSERT INTO new_measurement(measureID,temperature,humidity)
SELECT measureID,CASE temperature WHEN 1 THEN value END,value
FROM (
SELECT *,LEAD(terraID) OVER (ORDER BY time DESC) next_terraID,LEAD(pinID) OVER (ORDER BY time DESC) next_pinID
FROM measurement
) t
WHERE terraID <> next_terraID OR pinID <> next_pinID
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。