我有很多设备通过网状网络连接。每个设备都有一个序列号。每个设备发出一小时的消息说“我还在这里。”#34;服务器记录它没有收到该消息的时间段,我们称之为#34; stale&#34 ;.
设备过时的每个实例都会在"警告"中创建一个新行。我们的数据库表。
我想要做的是创建一个报表,每个设备只有一行过时,该设备的每个实例的开始和结束时间戳都是过时的列,继续到直到没有更多的陈旧情况。
示例输出:
SERIAL_NUMBER, START, END, START, END, START, END . . .
18462G, 2016-02-03 12:45, 2016-02-03-18:43, 2016-02-05 09:55, 2016-02-07 19:11
T8837G, 2016-02-05 02:34,
7465LT, 2016-02-02 17:45, 2016-02-05 18:13,
在此示例中,设备18462G已过时3次(意味着它在"警报"表中有3行),但目前尚未过时。
T8837G已经过时一次(警报表中有1行),并且仍然过时(没有结束日期)。
7465LT已失效两次(警报表中有2行),但目前处于活动状态。
我试过" GROUP BY"在我的MySQL中,它似乎没有起作用。
SELECT device.serial_number AS 'device',
location.name AS 'location',
alerting.start AS 'start',
alerting.end AS 'end'
FROM alerting
JOIN device ON alerting.device_id = device.id
JOIN device_location ON device_location.device_id = device.id
JOIN location ON device_location.location_id = location.id
GROUP BY device
ORDER BY location, device;
答案 0 :(得分:1)
一种可能的方式(类似)但不完全像你的样本基于group_concat和concat
SELECT device.serial_number AS device,
location.name AS location,
group_concat(concat('start : ',alerting.start,'end : ',alerting.end))
FROM alerting
JOIN device ON alerting.device_id = device.id
JOIN device_location ON device_location.device_id = device.id
JOIN location ON device_location.location_id = location.id
GROUP BY device.serial_number, location.name
ORDER BY location.name, device.serial_number;