如果数据丢失,平均每小时添加一条空记录

Posted

技术标签:

【中文标题】如果数据丢失,平均每小时添加一条空记录【英文标题】:Average per hour adding an empty record if data is missing 【发布时间】:2021-11-15 22:57:06 【问题描述】:

我有这些数据:

temp_humid
+---------+------+-------+---------------------+
| source  | temp | humid | stamp               |
+---------+------+-------+---------------------+
| cuisine | 10.0 |  70.0 | 2019-07-21 20:21:56 |
| chambre | 20.0 |  80.0 | 2019-07-21 20:23:43 |
| cuisine | 11.0 |  71.0 | 2019-07-21 20:01:56 |
| chambre | 21.0 |  81.0 | 2019-07-21 20:04:11 |
| chambre | 20.0 |  72.0 | 2019-07-21 21:09:11 |
| cuisine | 30.0 |  92.0 | 2019-07-21 21:11:56 |
| cuisine | 22.0 |  72.0 | 2019-07-21 21:01:56 |
| chambre | 34.0 |  94.0 | 2019-07-21 21:04:12 |
| chambre | 20.0 |  72.0 | 2019-07-21 23:09:11 |
| cuisine | 30.0 |  92.0 | 2019-07-21 23:11:56 |
| cuisine | 22.0 |  72.0 | 2019-07-21 23:01:56 |
| chambre | 34.0 |  94.0 | 2019-07-21 23:04:12 |
+---------+------+-------+---------------------+

我需要将每小时的平均值存储在第二张表中。 不知道如果一个小时没有数据,我是否也可以插入一个NULL记录,也许在第二次处理中。

temp_humid_total
+----+--------------+---------------+--------------+---------------+---------------------+
| id | cuisine_temp | cuisine_humid | chambre_temp | chambre_humid | stamp               |
+----+--------------+---------------+--------------+---------------+---------------------+
|  1 | 10.5         | 70.5          | 20.5         | 80.5          | 2019-07-21 20:00:00 |
|  2 | 26.0         | 82            | 27.0         | 83            | 2019-07-21 21:00:00 |
|  3 | NULL         | NULL          | NULL         | NULL          | 2019-07-21 22:00:00 |
|  4 | 26.0         | 82            | 27.0         | 83            | 2019-07-21 23:00:00 |
+----+--------------+---------------+--------------+---------------+---------------------+

我尝试过第一次治疗,但做不到。

INSERT INTO temp_humid_total(cuisine_temp, cuisine_humid, chambre_temp, chambre_humid, stamp) VALUES
(
    (SELECT AVG(temp), AVG(humid)
        FROM temp_humid
        WHERE source="cuisine"
        GROUP BY YEAR(stamp), MONTH(stamp), DAY(stamp), HOUR(stamp)
    ),
    (SELECT AVG(temp), AVG(humid), stamp
        FROM temp_humid
        WHERE source="chambre"
        GROUP BY YEAR(stamp), MONTH(stamp), DAY(stamp), HOUR(stamp)
    )
);

我收到一条错误消息,但不知道它是哪个操作数。

ERROR 1241 (21000): Operand should contain 1 column(s)

创建数据集:

CREATE TABLE `temp_humid` (
  `source` enum('chambre','cuisine') NOT NULL,
  `temp` decimal(3,1) NOT NULL,
  `humid` decimal(4,1) NOT NULL,
  `stamp` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `temp_humid` (`source`, `temp`, `humid`, `stamp`) VALUES
('cuisine', '10.0', '70.0', '2019-07-21 20:21:56'),
('chambre', '20.0', '80.0', '2019-07-21 20:23:43'),
('cuisine', '11.0', '71.0', '2019-07-21 20:01:56'),
('chambre', '21.0', '81.0', '2019-07-21 20:04:11'),
('chambre', '20.0', '72.0', '2019-07-21 21:09:11'),
('cuisine', '30.0', '92.0', '2019-07-21 21:11:56'),
('cuisine', '22.0', '72.0', '2019-07-21 21:01:56'),
('chambre', '34.0', '94.0', '2019-07-21 21:04:12'),
('cuisine', '20.0', '72.0', '2019-07-21 23:09:11'),
('chambre', '30.0', '92.0', '2019-07-21 23:11:56'),
('cuisine', '22.0', '72.0', '2019-07-21 23:01:56'),
('chambre', '34.0', '94.0', '2019-07-21 23:04:12');

CREATE TABLE `temp_humid_total` (
  `id` int(11) NOT NULL,
  `cuisine_temp` decimal(3,1) DEFAULT NULL,
  `cuisine_humid` decimal(4,1) DEFAULT NULL,
  `chambre_temp` decimal(3,1) DEFAULT NULL,
  `chambre_humid` decimal(4,1) DEFAULT NULL,
  `stamp` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `temp_humid_total`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `temp_humid_total`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

【问题讨论】:

尝试删除其中两个选择查询周围的brackets () @groovy_guy ERROR 1064 (42000): 你的 SQL 语法有错误 INSERT INTO temp_humid_total(cuisine_temp, cuisine_humid) SELECT AVG(temp), AVG(humid) FROM temp_humid WHERE source="cuisine" GROUP BY YEAR(stamp), MONTH(stamp), DAY(stamp), HOUR(stamp) 这应该可以,但是添加两个选择查询我不确定它是否有效 谢谢,它可以工作,但缺少房间和时间。两个 SELECT:( 的语法错误 这是什么关系型数据库?我猜 mysql 是因为 enum 类型,但澄清会帮助人们帮助你。 【参考方案1】:

这看起来像条件​​聚合:

select date_format(stamp, '%Y-%m-%d %H') as yyyymmddhh,
       avg(case when source = 'cuisine' then temp end) as cuisine_temp,
       avg(case when source = 'cuisine' then temp end) as cuisine_humid,
       avg(case when source = 'chambre' then temp end) as chambre_temp,
       avg(case when source = 'chambre' then temp end) as chambre_humid
from temp_humid
group by yyyymmdd;

【讨论】:

我将做第二个过程来添加一个空行。谢谢:) 对我来说也有新的东西,谢谢@GordonLinoff

以上是关于如果数据丢失,平均每小时添加一条空记录的主要内容,如果未能解决你的问题,请参考以下文章

防止 .Net 服务重新启动时数据丢失

使用 Lag 分析函数查找丢失的小时

熊猫:Groupby,循环并添加一小时迭代与组内的条件

大话RAC介质恢复---联机日志损坏

平均 UDP 数据包丢失和数据包重新排序

错误:ER_NO_SUCH_TABLE:如何在更新数据库后同步丢失的表