【发布时间】:2021-09-29 10:07:32
【问题描述】:
我正在构建一个 MySQL 表来为客户汇总一组特定信息。我已经使用简单的INNER JOIN 命令在具有共享键/列的记录上成功组装和过滤了大部分内容,但是数据的旋转/转置,即使是固定大小,仍然导致我的查询出现一些语法混乱.这张表t_snapshots的schema如下:
+-------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| value_type | tinyint(1) unsigned | YES | | NULL | |
| ch1_id | varchar(20) | YES | | NULL | |
| ch1_val | float | NO | | 0 | |
| ch2_id | varchar(20) | YES | | NULL | |
| ch2_val | float | NO | | 0 | |
| ch3_id | varchar(20) | YES | | NULL | |
| ch3_val | float | NO | | 0 | |
| ch4_id | varchar(20) | YES | | NULL | |
| ch4_val | float | NO | | 0 | |
| timestamp | datetime | NO | MUL | current_timestamp() | |
+-------------+---------------------+------+-----+---------------------+----------------+
简单地说,我想从t_other_data0.ch[n] 中选择最近更新的值发送到t_snapshots.ch[n]_val,并从t_id_pool.unit_id 中为每个唯一的t_id_pool.channel_num 选择最近更新的id 发送到t_snapshots.ch[n]_id。 t_id_pool.channel_num 与列 t_snapshots.ch[n]_val 的 n 值相关:
--EDIT--:理想情况下,来自源表t_other_data0 的样本数据从t_id_pool 中查找channel_num=1,2,3,4 的最新unit_id 值并输出到表t_snapshots:
从t_other_data0 收集最新的过程数据。在这种情况下,将选择具有 id 5-8 的行,因为它们跨越所有不同的 value_type 和最新的 timestamp。:
Table: t_other_data0
+----+------+------+------+------+------------+---------------------+
| id | ch1 | ch2 | ch3 | ch4 | value_type | timestamp |
+----+------+------+------+------+------------+---------------------+
| 1 | 1.65 | 3.25 | 1.98 | 2.17 | 1 | 2021-07-22 16:26:40 |
| 2 | 3.12 | 2.33 | 6.42 | 3.22 | 2 | 2021-07-22 16:26:40 |
| 3 | 2.22 | 2.24 | 3.34 | 1.17 | 3 | 2021-07-22 16:26:40 |
| 4 | 1.52 | 1.34 | 1.9 | 2.01 | 4 | 2021-07-22 16:26:40 |
| 5 | 3.2 | 3.21 | 5.42 | 2.13 | 1 | 2021-07-22 16:26:50 |
| 6 | 1.55 | 1.92 | 4.32 | 4.12 | 2 | 2021-07-22 16:26:50 |
| 7 | 2.31 | 1.93 | 2.36 | 3.4 | 3 | 2021-07-22 16:26:50 |
| 8 | 1.78 | 2.17 | 5.62 | 2.34 | 4 | 2021-07-22 16:26:50 |
+----+------+------+------+------+------------+---------------------+
因为这些永久频道会更改它们所绑定的临时设备,所以我们使用来自t_id_pool 的最新unit_id 来确定每个channel_num 的当前unit_id:
Table: t_id_pool
+----+---------------------+-------------+---------+
| id | timestamp | channel_num | unit_id |
+----+---------------------+-------------+---------+
| 1 | 2021-07-22 09:39:09 | 1 | S4251 |
| 2 | 2021-07-22 09:38:09 | 2 | S3552 |
| 3 | 2021-07-22 09:38:09 | 3 | S0001 |
| 4 | 2021-07-22 09:38:09 | 4 | S1001 |
| 5 | 2021-07-22 09:39:10 | 1 | P5251 |
| 6 | 2021-07-22 09:38:10 | 2 | P4552 |
| 7 | 2021-07-22 09:38:10 | 3 | P1001 |
| 8 | 2021-07-22 09:38:10 | 4 | P2001
+----+---------------------+-------------+---------+
输出到t_snapshots:
Table: t_snapshots
+-----+---------------------+------------+--------+---------+--------+---------+--------+---------+--------+---------+
| id | timestamp | value_type | ch1_id | ch1_val | ch2_id | ch2_val | ch3_id | ch3_val | ch4_id | ch4_val |
+-----+---------------------+------------+--------+---------+--------+---------+--------+---------+--------+---------+
| 211 | 2021-07-14 16:26:50 | 1 | P5251 | 3.2 | P4552 | 3.21 | P1001 | 5.42 | P2001 | 2.13 |
| 212 | 2021-07-14 16:26:50 | 2 | P5251 | 1.55 | P4552 | 1.92 | P1001 | 4.32 | P2001 | 4.12 |
| 213 | 2021-07-14 16:26:50 | 3 | P5251 | 2.31 | P4552 | 1.93 | P1001 | 2.36 | P2001 | 3.4 |
+-----+---------------------+------------+--------+---------+--------+---------+--------+---------+--------+---------+
【问题讨论】:
-
与我们分享来自
t_id_pool表的一些示例(假)数据。还有这些示例数据,SELECT查询中的预期结果如何。 -
@FaNo_FN 进行编辑以根据要求描述源表和理想输出
-
id=4被选中?因为它似乎不是最新的timestamp。另外,我没有在输出中看到任何id=4行数据。 -
我想知道为什么
t_other_data.id=8不见了。我开始a fiddle 但没时间了。 mariadb-10.4 dbfiddle<> 本来会更好,但目前它不适合我。 -
关于 id=4 是正确的。在我的示例中,我的意思是选择了 id 为 5-8 的行。我已经更正了这一点,以及拼写错误的表名。
标签: mysql mariadb mariadb-10.3