数据库行列差
采集来的数据是定时采集的
有个需求就就是 现在有个需求就是需要统计每个月的峰电平电和谷电的数据 这样就需要我们求取每行的列差了
SELECT b.*, (b.energy_next -b.energy_upper) AS cost FROM(
SELECT
id,
energy,
ipadd,
DATE_FORMAT( cj_data, '%Y-%m-%d %H:%i:%s' ) sj,
@a.energy AS energy_next,--下一个时间段的
@a.energy:= a.energy AS energy_upper, --当前时间段的
( CASE
WHEN DATE_FORMAT( cj_data, '%H' ) = '00' THEN '低谷'
WHEN DATE_FORMAT( cj_data, '%H' ) = '08' THEN '高峰'
WHEN DATE_FORMAT( cj_data, '%H' ) = '12' THEN '平段'
WHEN DATE_FORMAT( cj_data, '%H' ) = '17' THEN '高峰'
WHEN DATE_FORMAT( cj_data, '%H' ) = '21' THEN '平段' ELSE '保密' END ) AS paragraph
FROM "TABLE-XXXXX" a ,
(SELECT @a.energy := 0) r
ORDER BY cj_data DESC)b
最终的结果
因为 在查询的时候 会出现 没有下一次的采集数据
所以 我们查询到的数据中第一条就会出现负数 这个时间段能耗拿不到 这个时候 我们就需要吧第一条数据排除掉
在这个时候我们就需要把上面的sql
改造一下
SELECT b.*, (b.energy_next -b.energy_upper) AS cost FROM(
SELECT
id,
energy,
ipadd,
DATE_FORMAT( cj_data, '%Y-%m-%d %H:%i:%s' ) sj,
@a.energy AS energy_next,
@a.energy:= a.energy AS energy_upper,
(@rownum := @rownum + 1) AS rownum,
( CASE
WHEN DATE_FORMAT( cj_data, '%H' ) = '00' THEN '低谷'
WHEN DATE_FORMAT( cj_data, '%H' ) = '08' THEN '高峰'
WHEN DATE_FORMAT( cj_data, '%H' ) = '12' THEN '平段'
WHEN DATE_FORMAT( cj_data, '%H' ) = '17' THEN '高峰'
WHEN DATE_FORMAT( cj_data, '%H' ) = '21' THEN '平段' ELSE '保密' END ) AS paragraph
FROM "TABLE-XXXXX" a ,
(SELECT @a.energy := 0) r,
(SELECT @rownum := 0) rw
ORDER BY cj_data DESC)b WHERE rownum>1
最终数据
在根据我们的需求把这些数据进行分组统计一下就好了