mysql显示两个值之差的和

hvvq6cgz  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(339)

下面是我的问题。

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.

8wtpewkr

8wtpewkr1#

您希望对连续行之间的差异求和。
例如,假设列具有这些值 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 .

70gysomp

70gysomp2#

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

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
k5hmc34c

k5hmc34c3#

进行外部查询

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`

相关问题