mysql 数据查询问题,通过一个字段,以及时间将同一表内两条数据合并,也可能没有对应数据

图片说明

数据库如图

有数据库大神能给个解决方法吗,这是一个设备的上下线记录,devid是设备id
value是上下线记录1是上线0是下线,可能会有异常数据(有上线没有下线)求大神给个sql解决一哈,将上下线合并为一条

3个回答

SELECT C,TO_CHAR(WM_CONCAT(DATA)) FROM (
SELECT C,TO_CHAR(Q,'YYYYMMDD')||'上线到'||TO_CHAR(W,'YYYYMMDD')||'下线' DATA FROM (
SELECT C,MIN(Q) Q,W FROM(
SELECT C,Q,W FROM(
SELECT H.*
,ROW_NUMBER()OVER(PARTITION BY Q,C ORDER BY W ) RM
FROM (
SELECT *
FROM (SELECT A.ID C,A.DATA Q FROM UP A WHERE A.UP_DOWN=1 ORDER BY A.DATA ) A
LEFT JOIN (SELECT B.ID D,B.DATA W FROM UP B WHERE B.UP_DOWN=0 ) B
ON C=D WHERE Q<W
) H
)
WHERE RM=1
)GROUP BY C,W
ORDER BY Q
)
) GROUP BY C

weixin_43490914
微风轻轻 起 我更新了下wm_concat SQL,你可以参考下
大约一个月之前 回复
weixin_43490914
微风轻轻 起 回复金长: id对应id,data对应tm,up_down对应value,先把上线的和下线的查出来,然后join起来,条件是上线时间小于下线时间(你可以试试加与不加的区别),然后根据上线时间和机器id对下线时间分组排序,然后取到排名为1的就是对应的上下线(此处可能存在连续的上线时间对应同一个下线时间)。下一步对机器id和下线时间分组,取上线时间最小的,这样就可以了(这块具体还是看你们业务要求),最后俩字段拼接就好了。这样出来的结果是一个机器上线一次直到它下线,为一条数据。如果最终要求一个机器只要一条,那就对机器分组,将拼接起来的新列的值拼起来就好了(有一个函数wm_concat好像是)。
大约一个月之前 回复
matcha923
金长 能在具体说一下嘛...我有点懵
大约一个月之前 回复

将上线和下线的数据作为两个子查询,然后再做一次连接就可以了吧

直接group by就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问