【问题标题】:MySQL show sum of difference of two valuesMySQL显示两个值的差异之和
【发布时间】:2020-10-17 20:09:46
【问题描述】:

以下是我的查询。

SELECT n.`name`,n.`customer_id`,m.`msn`, m.kwh,
   m.kwh - LAG(m.kwh) OVER(PARTITION BY n.`customer_id` ORDER BY m.`data_date_time`) AS kwh_diff
FROM mdc_node n
INNER JOIN `mdc_meters_data` m ON n.`customer_id` = m.`cust_id`
WHERE n.`lft` = 5 AND n.`icon` NOT IN ('folder')
AND m.`data_date_time` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()

这给了我下面的结果

我想总结 kwh_diff 并只显示一行记录而不是如下所示的多个记录

name customer_id msn sum_kwh_diff

Zeeshan 37010114711 4A60193390663 4.5

我尝试过以下操作

 SUM(m.kwh - LAG(m.kwh) OVER(PARTITION BY n.`customer_id` ORDER BY m.`data_date_time`)) AS sum_kwh_diff

得到Error Code: 4074 Window functions can not be used as arguments to group functions.

【问题讨论】:

    标签: mysql sql select sum window-functions


    【解决方案1】:

    您不能在聚合函数中使用窗口函数(反之亦然),在这里,您需要使用子查询,并在外部查询中聚合:

    SELECT name, customer_id, SUM(kwh_diff) sum_kwh_diff
    FROM (
        SELECT n.`name`,n.`customer_id`,m.`msn`, m.kwh,
           m.kwh - LAG(m.kwh) OVER(PARTITION BY n.`customer_id` ORDER BY m.`data_date_time`) AS kwh_diff
        FROM mdc_node n
        INNER JOIN `mdc_meters_data` m ON n.`customer_id` = m.`cust_id`
        WHERE n.`lft` = 5 AND n.`icon` NOT IN ('folder')
        AND m.`data_date_time` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
    ) t
    GROUP BY name, customer_id
    

    【讨论】:

      【解决方案2】:

      做一个外部查询

      SELECT
      `name`,`customer_id`,`msn`, SUM(kwh_diff) kwh_diff
      FROM
      (
          SELECT n.`name`,n.`customer_id`,m.`msn`, m.kwh,
             m.kwh - LAG(m.kwh) OVER(PARTITION BY n.`customer_id` ORDER BY m.`data_date_time`) AS kwh_diff
          FROM mdc_node n
          INNER JOIN `mdc_meters_data` m ON n.`customer_id` = m.`cust_id`
          WHERE n.`lft` = 5 AND n.`icon` NOT IN ('folder')
          AND m.`data_date_time` BETWEEN NOW() - INTERVAL 30 DAY AND NOW() ) t1
      GROUP BY `name`,`customer_id`,`msn`
      

      【讨论】:

        【解决方案3】:

        您想对连续行之间的差异求和。
        例如,假设您在列 kwh 中有这些值:

        kwh
        ---
        10
        12
        14
        17
        25
        32
        

        所以区别是:

        kwh_diff
        --------
        0
        12-10
        14-12
        17-14
        25-17
        32-25
        

        这些差异的总和等于32-10,即:

        最后一个值和第一个值的区别

        所以你需要的是窗口函数FIRST_VALUE() 来获取这些值:

        SELECT DISTINCT n.`name`, n.`customer_id`, m.`msn`, 
           FIRST_VALUE(m.kwh) OVER (PARTITION BY n.`customer_id` ORDER BY m.`data_date_time` DESC) -
           FIRST_VALUE(m.kwh) OVER (PARTITION BY n.`customer_id` ORDER BY m.`data_date_time` ASC) AS kwh_diff
        FROM mdc_node n
        INNER JOIN `mdc_meters_data` m ON n.`customer_id` = m.`cust_id`
        WHERE n.`lft` = 5 AND n.`icon` NOT IN ('folder')
        AND m.`data_date_time` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
        

        并且不需要子查询或聚合。

        我保留了我的代码PARTITION BY n.customer_id,因为您在代码中使用了它,尽管您可能需要PARTITION BY n.customer_id, m.msn

        【讨论】:

          猜你喜欢
          • 2014-04-10
          • 1970-01-01
          • 1970-01-01
          • 2020-10-12
          • 2023-03-26
          • 2021-10-14
          • 1970-01-01
          • 2020-04-03
          • 2018-01-06
          相关资源
          最近更新 更多