首页 > 试题广场 >

智能家居设备高能耗异常监控分析

[编程题]智能家居设备高能耗异常监控分析
  • 热度指数:336 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

某智能家居服务商需要监控用户家中各类设备的电力消耗情况。系统需要定期分析每台设备的月度用电量,找出那些比同类设备(如所有“空调”或所有“热水器”)平均用电量更高的“高耗能设备”,并对这些设备生成简报,以便提醒用户检查设备是否老化或存在漏电风险。

表结构和字段说明:

  • 表1:smart_devices(智能设备信息表)

    • device_id(varchar): 设备唯一标识符,主键。
    • device_name(varchar): 设备名称(如 "Living Room AC")。
    • category(varchar): 设备类别(如 "HVAC", "Lighting", "Kitchen")。
    • location(varchar): 设备所在具体位置(如 "Living Room", "Master Bedroom")。
    • install_date(date): 设备安装日期。
  • 表2:energy_logs(能耗日志表)

    • log_id(int): 日志ID,主键。
    • device_id(varchar): 设备ID,逻辑关联smart_devices.device_id。
    • usage_kwh(decimal): 该时段消耗的电量(千瓦时),保留两位小数。
    • log_timestamp(datetime): 记录日志的具体时间点。
    • status(varchar): 设备状态("active", "standby", "error")。

问题

请编写SQL查询,找出在 2025年1月(2025-01-01 至 2025-01-31) 期间,总用电量 严格大于 其所属设备类别(category)下所有设备该月平均总用电量的设备。

查询结果要求:

  1. device_name:设备名称。
  2. location_code:位置代码。要求将location字段中的所有空格替换为下划线_,并将结果转换为全大写(例如 "Living Room" 变为 "LIVING_ROOM")。
  3. total_usage:该设备2025年1月的总用电量,结果保留2位小数(四舍五入)。
  4. efficiency_level:能效评级。根据该设备的总用电量判断:
    • 如果total_usage>= 50.00,显示 'High Load'
    • 如果total_usage< 50.00,显示 'Normal'
  5. 结果排序:优先按total_usage从高到低排序;如果用电量相同,则按device_id升序排序。
示例1

输入

-- 创建设备表
CREATE TABLE smart_devices (
    device_id VARCHAR(20) PRIMARY KEY,
    device_name VARCHAR(50),
    category VARCHAR(30),
    location VARCHAR(50),
    install_date DATE
);

-- 创建能耗日志表
CREATE TABLE energy_logs (
    log_id INT PRIMARY KEY,
    device_id VARCHAR(20),
    usage_kwh DECIMAL(10, 2),
    log_timestamp DATETIME,
    status VARCHAR(20)
);

-- 插入设备数据
INSERT INTO smart_devices VALUES ('D001', 'Master Bedroom AC', 'HVAC', 'Master Bedroom', '2024-05-20');
INSERT INTO smart_devices VALUES ('D002', 'Living Room AC', 'HVAC', 'Living Room', '2024-06-15');
INSERT INTO smart_devices VALUES ('D003', 'Kitchen Fridge', 'Kitchen', 'Kitchen Area', '2024-01-10');
INSERT INTO smart_devices VALUES ('D004', 'Smart Oven', 'Kitchen', 'Kitchen Area', '2024-11-05');
INSERT INTO smart_devices VALUES ('D005', 'Guest Room AC', 'HVAC', 'Guest Room', '2024-12-01');

-- 插入能耗日志数据 (2025年1月数据为主,包含少量干扰数据)
-- HVAC类: D001(Total: 40+25=65), D002(Total: 80+10=90), D005(Total: 20). Avg = (65+90+20)/3 = 58.33
-- Kitchen类: D003(Total: 30), D004(Total: 10). Avg = 20.
INSERT INTO energy_logs VALUES (1, 'D001', 40.00, '2025-01-05 10:00:00', 'active');
INSERT INTO energy_logs VALUES (2, 'D001', 25.00, '2025-01-20 14:00:00', 'active');
INSERT INTO energy_logs VALUES (3, 'D002', 80.00, '2025-01-15 18:00:00', 'active');
INSERT INTO energy_logs VALUES (4, 'D002', 10.00, '2025-01-16 09:00:00', 'standby');
INSERT INTO energy_logs VALUES (5, 'D003', 30.00, '2025-01-10 12:00:00', 'active'); -- 高于Kitchen平均
INSERT INTO energy_logs VALUES (6, 'D004', 10.00, '2025-01-12 18:00:00', 'active');
INSERT INTO energy_logs VALUES (7, 'D005', 20.00, '2025-01-25 20:00:00', 'active');
INSERT INTO energy_logs VALUES (8, 'D002', 50.00, '2024-12-31 23:59:00', 'active'); -- 干扰数据:非2025年1月

输出

device_name|location_code|total_usage|efficiency_level
Living Room AC|LIVING_ROOM|90.00|High Load
Master Bedroom AC|MASTER_BEDROOM|65.00|High Load
Kitchen Fridge|KITCHEN_AREA|30.00|Normal

说明

解析逻辑:

  • HVAC类:D001(65), D002(90), D005(20)。平均值 = (65+90+20)/3 = 58.33。
    • D001 (65 > 58.33) -> 选中。Location: MASTER_BEDROOM.
    • D002 (90 > 58.33) -> 选中。Location: LIVING_ROOM.
    • D005 (20 < 58.33) -> 排除。
  • Kitchen类:D003(30), D004(10)。平均值 = (30+10)/2 = 20.00。
    • D003 (30 > 20) -> 选中。Location: KITCHEN_AREA.
  • 排序:Total Usage 降序 (90 -> 65 -> 30)。
device_namelocation_codetotal_usageefficiency_level
Living Room ACLIVING_ROOM90.00High Load
Master Bedroom ACMASTER_BEDROOM65.00High Load
Kitchen FridgeKITCHEN_AREA30.00Normal
头像 牛客907689258号
发表于 2026-02-01 09:34:17
WITH device_usage AS ( -- ① 每台设备 2025年1月总用电量 SELECT t2.device_id, t2.device_name, t2.category, t2.location, 展开全文
头像 爱吃香菜的momo
发表于 2026-02-02 21:30:12
with avg_t as ( select category,sum(usage_kwh)/count(distinct energy_logs.device_id) avg_usage from smart_devices join energy_logs using(d 展开全文
头像 攸四
发表于 2026-02-06 10:25:59
# STEP1 计算各类别平均总耗电量 with a1 as ( select category,sum(usage_kwh)/count(*) as avg_category from smart_devices a left join energy_logs b on a.device_id 展开全文
头像 理智的海豚要双休
发表于 2026-02-03 14:52:17
with total_avg_kwh as ( select sd.category, round(avg(el.usage_kwh),2) as avg_kwh from energy_logs el left join smart_devices sd on el.device_id=sd.de 展开全文
头像 冰淇淋12322
发表于 2026-02-01 23:34:30
# 1、计算每台设备总用电量 with t1 as ( select e.device_id, device_name, location, category, sum(usage_kwh) as sum_usage from energy_l 展开全文