mysql - 如果共享相同的时间戳,则多次选择一列作为单独的列
问题描述
我有一个表,其中存储了针对通道 ID 的数据。频道 ID 有一个合作伙伴频道 ID,该频道 ID 属于具有自己唯一 ID 的设备,但是频道数据并不总是共享相同的时间戳,并且频道 ID 可能不是增量的。
我想通过使用通道 ID 定义顺序来提取每一对,但显示 DATUM 列两次,每个通道 ID 一次。如果频道 ID 没有该时间段的数据,我想返回“NULL”。
create table DATUM (DATUM_TIMESTAMP varchar(255), DEVICE_ID varchar(255), CHANNEL_ID varchar(255), DATUM varchar(255));
INSERT INTO DATUM VALUES ('2021-08-10T00:00', '1', '1', '10');
INSERT INTO DATUM VALUES ('2021-08-10T00:00', '1', '2', '20');
INSERT INTO DATUM VALUES ('2021-08-10T00:01', '1', '1', '10');
INSERT INTO DATUM VALUES ('2021-08-10T00:02', '1', '2', '20');
INSERT INTO DATUM VALUES ('2021-08-10T00:00', '2', '3', '10');
INSERT INTO DATUM VALUES ('2021-08-10T00:00', '2', '4', '20');
INSERT INTO DATUM VALUES ('2021-08-10T00:01', '2', '3', '10');
INSERT INTO DATUM VALUES ('2021-08-10T00:02', '2', '4', '20');
预期输出:
选择 DATUM_TIMESTAMP、DATUM(其中 CHANNEL_ID = 1)、DATUM(其中 CHANNEL_ID = 2)
--------------------------------
DATUM_TIMESTAMP | DATUM | DATUM
--------------------------------
2021-08-10T00:00 | 10 | 20
2021-08-10T00:01 | 10 | NULL
2021-08-10T00:02 | NULL | 20
选择 DATUM_TIMESTAMP,DATUM(其中 CHANNEL_ID = 4),DATUM(其中 CHANNEL_ID = 3)
--------------------------------
DATUM_TIMESTAMP | DATUM | DATUM
--------------------------------
2021-08-10T00:00 | 20 | 10
2021-08-10T00:01 | NULL | 10
2021-08-10T00:02 | 20 | NULL
我通过使用 group_concat 接近了,但它不会产生 NULL,我需要使用另一列 DEVICE_ID,并且我需要在 SQL 之外处理输出以拆分 DATUM 列。
select DATUM_TIMESTAMP, DEVICE_ID, group_concat(CHANNEL_ID), group_concat(DATUM order by case when CHANNEL_ID = '1' then '1' when CHANNEL_ID = '2' then '2' else CHANNEL_ID end asc) as 'DATUM' from DATUM where DEVICE_ID = 1 group by DATUM_TIMESTAMP, DEVICE_ID;
解决方案
这段代码很长,但这可能会对您有所帮助。
SELECT DATUM_TIMESTAMP,
(SELECT datum FROM datum b WHERE channel_id=1 AND a.DATUM_TIMESTAMP=b.DATUM_TIMESTAMP) AS datum,
(SELECT datum FROM datum b WHERE channel_id=2 AND a.DATUM_TIMESTAMP=b.DATUM_TIMESTAMP) AS datum
FROM datum a WHERE (channel_id=1 OR channel_id=2) AND device_id=1 GROUP BY DATUM_TIMESTAMP;
输出
DATUM_TIMESTAMP datum datum
---------------- ------ --------
2021-08-10T00:00 10 20
2021-08-10T00:01 10 (NULL)
2021-08-10T00:02 (NULL) 20
要获得第二个输出,只需channel_id
在两个嵌入式选择查询和where
主查询的子句中更改。
SELECT DATUM_TIMESTAMP,
(SELECT datum FROM datum b WHERE channel_id=4 AND a.DATUM_TIMESTAMP=b.DATUM_TIMESTAMP) AS datum,
(SELECT datum FROM datum c WHERE channel_id=3 AND a.DATUM_TIMESTAMP=c.DATUM_TIMESTAMP) AS datum
FROM datum a WHERE (channel_id=4 OR channel_id=3) AND device_id=2 GROUP BY DATUM_TIMESTAMP;
输出
DATUM_TIMESTAMP datum datum
---------------- ------ --------
2021-08-10T00:00 20 10
2021-08-10T00:01 (NULL) 10
2021-08-10T00:02 20 (NULL)
推荐阅读
- r - R:当另一列中的值第一次变为负时,返回列中的值
- google-compute-engine - GCP 控制台用户要求以 root 用户身份更改密码
- google-analytics - 分析/跟踪代码管理器事件和页面浏览值之间的差异
- jquery-ui-sortable - 语义 UI:如何销毁可排序的表?
- javascript - 按名称检索键值对的值(Javascript)
- r - RcppArmadillo "Error in inDL(x, as.logical(local), as.logical(now), ...)" 在 Windows 平台下
- php - 没有在 php mysql 中获取正确的数据
- sql - SQL Query-将下表转换为所需格式
- c# - 异步和等待调用者不是异步但被调用的方法是
- php - 解析以“=”符号开头的 XML 字符串