医院数据库SQL查询:找出使用频率与年龄比值最高的设备
解决思路:计算设备使用频率与年龄的最高比值
我来帮你完善这个查询,要实现“找出使用频率与自身年龄比值最高的设备”这个需求,我们需要把设备的使用次数和它的服役年龄关联起来计算,具体可以这样做:
完整SQL查询语句
SELECT e.id AS equipment_id, e.model, COUNT(DISTINCT ar.appointment_id) AS usage_frequency, TIMESTAMPDIFF(YEAR, e.release_date, CURDATE()) AS equipment_age, -- 计算比值,用NULLIF避免年龄为0时的除以0错误 COUNT(DISTINCT ar.appointment_id) / NULLIF(TIMESTAMPDIFF(YEAR, e.release_date, CURDATE()), 0) AS usage_age_ratio FROM equipment e LEFT JOIN appointmentrelations ar ON e.id = ar.equipment_id GROUP BY e.id, e.model, e.release_date ORDER BY usage_age_ratio DESC LIMIT 1;
逐部分解释
- 关联两张表:用
LEFT JOIN把equipment和appointmentrelations通过设备ID关联,确保即使设备从未被使用过也能被统计(如果只需要统计有过使用记录的设备,换成INNER JOIN即可)。 - 统计使用频率:沿用你之前的
COUNT(DISTINCT ar.appointment_id),统计每个设备被不同预约使用的次数。 - 计算设备年龄:用
TIMESTAMPDIFF(YEAR, e.release_date, CURDATE())计算设备从发布到当前的服役年数(这个函数适用于MySQL;如果是PostgreSQL,可替换为EXTRACT(YEAR FROM AGE(CURRENT_DATE, release_date)))。 - 计算比值:用使用频率除以设备年龄,
NULLIF(..., 0)是为了避免设备刚发布(年龄为0)时出现除以0的报错,此时比值会返回NULL,不会干扰排序。 - 排序取最高值:按比值降序排序,
LIMIT 1直接取出比值最高的设备。
结合示例数据验证
用你提供的示例数据计算:
- e1:使用频率1,年龄20年,比值=1/20=0.05
- e2:使用频率2,年龄7年,比值≈2/7≈0.2857
- e3:使用频率2,年龄9年,比值≈2/9≈0.2222
最终排序后e2的比值最高,和示例预期结果一致。
内容的提问来源于stack exchange,提问作者S.John
相关产品推荐
相关产品推荐

