下面是我的疑问。
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
进行汇总,并且只显示一行记录,而不是多行记录,如下所示
名称customer_id msn SUM_KWH_DIFF
泽山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
并得到错误代码:4074窗口函数不能用作分组函数的参数。
您希望将连续行之间的差异求和。
例如,列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()
并且不需要子查询或聚合。
我在代码中保留了分区BY n.customer_id
,因为您在代码中使用了它,尽管您可能需要分区BY n.customer_id,m.msn
。
您不能在聚合函数中使用窗口函数(相反的情况也是可能的),在这里,您需要使用子查询,并在外部查询中聚合:
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
进行外部查询
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`