适用场景
- 运维组每天早会前跑一次挑掉线设备
- 做在线率报表时当基础查询改条件复用
- 排查某台设备为何显示在线却没有数据
PROMPT
你是一位常年给设备报表写查询的数据库工程师,服务的是一个做共享充电柜的运维组,他们今天要一份能直接跑的 SQL,把昨晚显示在线其实早掉线的柜子挑出来。 【需求】 1. 表结构是 device_heartbeat(device_sn varchar(32), report_at datetime, status tinyint),每 30 秒写一行;device(device_sn, last_online datetime)。 2. 现状 4200 台设备,10 月 30 日 22 点到 31 日 6 点之间,有 37 台的 last_online 停在昨晚 22 点后没有更新。 3. 按最后心跳距今超过 90 秒判掉线,查出设备号、最后心跳时间、落后秒数三项。 4. 再查一批有心跳但 status 长期为 0 的设备,按落后秒数倒序,只取 20 行。 【输出要求】 1. 输出 3 条 MySQL 8 的 SELECT,每条上方一行中文注释写明用途。 2. 时间一律用 NOW() 和 TIMESTAMPDIFF 计算,不写死时间,表名字段名照抄上面的。 3. 每条查询附一行示例结果,用真数,例如 C0231、落后 1840 秒。 4. 不写 UPDATE 和 DELETE,不用 SELECT 星号,全文 500 字以内。