MySQL实现单表每日参数差值拆分至多列的查询求助
实现多参数每日差值的列转行展示
表结构说明
有一张名为energymeter的表,包含三列:
Date:日期时间字段Name:计量参数名称(字符串类型,对应3个不同参数)Value:参数的实时数值
需求
在指定时间范围内,计算每个参数的每日最大值与最小值的差值,并将3个参数的差值分别展示为独立列。
当前单参数查询实现
已能通过以下SQL查询单个参数的每日差值:
select Date(Date) as Date, Max(Value) - Min(Value) as Value , Name from energy_meter.energy_meter WHERE Name ='Energy_Meters\[1\].Total_active_energy_kWh' And DATE(Date) between '2022-10-01' and '2022-10-13' group by DATE(Date)
预期结果格式
希望结果以日期为行维度,每个参数的每日差值作为单独列,示例结构如下:
| Date | 参数1差值 | 参数2差值 | 参数3差值 |
|---|---|---|---|
| 2022-10-01 | 12.5 | 8.3 | 5.1 |
| 2022-10-02 | 11.2 | 7.9 | 4.8 |
| ... | ... | ... | ... |
解决方案:条件聚合实现列转行
使用CASE WHEN结合聚合函数,针对每个参数单独计算当日差值,最终将结果转为多列:
SELECT DATE(Date) AS Date, -- 第一个参数的每日差值 MAX(CASE WHEN Name = 'Energy_Meters\[1\].Total_active_energy_kWh' THEN Value END) - MIN(CASE WHEN Name = 'Energy_Meters\[1\].Total_active_energy_kWh' THEN Value END) AS Energy_Meter_1_Diff, -- 替换为第二个实际参数名 MAX(CASE WHEN Name = 'Energy_Meters\[2\].Total_active_energy_kWh' THEN Value END) - MIN(CASE WHEN Name = 'Energy_Meters\[2\].Total_active_energy_kWh' THEN Value END) AS Energy_Meter_2_Diff, -- 替换为第三个实际参数名 MAX(CASE WHEN Name = 'Energy_Meters\[3\].Total_active_energy_kWh' THEN Value END) - MIN(CASE WHEN Name = 'Energy_Meters\[3\].Total_active_energy_kWh' THEN Value END) AS Energy_Meter_3_Diff FROM energy_meter.energy_meter WHERE DATE(Date) BETWEEN '2022-10-01' AND '2022-10-13' GROUP BY DATE(Date) ORDER BY Date;
说明
- 每个
CASE WHEN子句筛选对应参数的当日数据,再通过MAX()和MIN()计算差值 - 需要将SQL中的参数名替换为实际存在的3个
Name值 - 可根据需求自定义列别名(
AS后的名称)
内容的提问来源于stack exchange,提问作者Waseem Usman
相关产品推荐
相关产品推荐

