【问题标题】:How to group by day/month/year on a subquery如何在子查询中按日/月/年分组
【发布时间】:2018-03-13 17:59:32
【问题描述】:

我有一个像这样的简单表格(以实际 x 千值表示):

在这张表上,我正在做一个查询以获取差异(效果很好):

select
  EL.sensor_id,
  EL.value_id,
  EL.time,
  EL.value,
  if( @lastSN = EL.sensor_id, EL.value - @lastValue, 0000.00 ) as diff,
  @lastSN := EL.sensor_id,
  @lastValue := EL.value
from
      data_test_debug EL,
      ( select @lastSN := 0,
               @lastValue := 0 ) SQLVars
   where EL.value_id = "gas"
   order by
      EL.sensor_id,
      EL.time

结果如下:

现在我遇到了一个问题,因为我必须对差异数据进行分组。

按天、月、周或年(用于在图表中表示数据)

我尝试过这样的事情:

select MONTHNAME(EL.time), SUM(EL.diff)
FROM data_test_debug EL,

(select
      EL.sensor_id,
      EL.value_id,
      EL.time,
      EL.value,
      if( @lastSN = EL.sensor_id, EL.value - @lastValue, 0000.00 ) as diff,
      @lastSN := EL.sensor_id,
      @lastValue := EL.value
   from
      data_test_debug EL,
      ( select @lastSN := 0,
               @lastValue := 0 ) SQLVars
   where EL.value_id = "gas"
   order by
      EL.sensor_id,
      EL.time) AS t
GROUP BY YEAR(EL.time), MONTH(EL.time)

但没有期待得到结果..

数据每小时收集一次,因此需要分组。

【问题讨论】:

    标签: mysql sql grouping


    【解决方案1】:

    不要再次加入表格。将分组直接应用于子查询:

    SELECT YEAR(time), MONTHNAME(time), SUM(diff)
    FROM (select EL.sensor_id,
                 EL.value_id,
                 EL.time,
                 EL.value,
                 if(@lastSN = EL.sensor_id, EL.value - @lastValue, 0.0) as diff,
                 @lastSN := EL.sensor_id,
                 @lastValue := EL.value
          FROM data_test_debug EL, (SELECT @lastSN := 0,
                                    @lastValue := 0) SQLVars
          WHERE EL.value_id = "gas"
          ORDER BY EL.sensor_id, EL.time
         ) AS t
    GROUP BY YEAR(time), MONTH(time)
    

    可以通过删除所有不使用的字段来大大简化它,但你可以在它工作后这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2021-08-22
      • 2016-06-24
      • 1970-01-01
      相关资源
      最近更新 更多