[英]SQL- return a difference of number in a column in a table grouped by year (ORACLE)
我有两个表,如下所示:
资产表:
assetnum | depid
----------------
1 | eng
2 | ap
3 | cao
. | .
. | .
. | .
和
抄表:
assetnum | meterreading_date | reading
---------------------------------------
1 | 4/7/2017 | 50000
2 | 3/5/17 | 30000
3 | 1/15/17 | 10000
. | . | .
. | . | .
. | . | .
我正在努力加入并获得每种资产的年度使用量。 换句话说,我想获取资产编号depid(按当年使用情况分组)(该年记录的最后日期的最后一次读数-该年记录的第一个日期的第一次读数)。
例如在上述情况下,我将输出为
assetnum | depid | usage
-------------------------
1 | eng | 40000 (50000-10000)
. | . | .
. | . | .
. | . | .
如果我理解正确,则只需要join
和group by
:
select mr.assetnum, a.depid,
(max(usage) - min(usage)) as usage
from Meterreading mr join
Asset a
on mr.assetnum = a.assetnum
where meterreading_date >= date '2017-01-01 and
meterreading_date < '2018-01-01' -- unnecessary for the current year
group by mr.assetnum, a.depid;
Tweeking Gordon的回答...只是从日期中提取年份,然后根据其分组以消除位置。
SELECT mr.assetnum
, a.depid
, max(usage) - min(usage) as usage
, to_char(meterreading_date,'YYYY') as Year
FROM Meterreading mr
INNER join Asset a
on mr.assetnum = a.assetnum
GROUP BY mr.assetnum, a.depid, to_char(meterreading_date,'YYYY')
或者...使用解压缩vs to_char ...
SELECT mr.assetnum
, a.depid
, max(usage) - min(usage) as usage
, extract(year from meterreading_date) as Year
FROM Meterreading mr
INNER join Asset a
on mr.assetnum = a.assetnum
GROUP BY mr.assetnum, a.depid, extract(year from meterreading_date)
在这两种情况下,这都会获得每年的MIN(最小)和max(最大)使用量,并从最大值中减去最小。 它不是日期驱动的,而是使用/年驱动的。 如果您出于某种原因在当年晚些时候的读数低于最高值...它可能无法返回预期的结果...要真正成为日期驱动型,我们需要获取最小/最大日期来查找这些值的用法并从那里去。
例如,如果阅读是:
assetnum | meterreading_date | reading
---------------------------------------
1 | 7/5/2017 | 70000
1 | 6/1/2017 | 10000
1 | 5/7/2017 | 60000
1 | 4/7/2017 | 50000
1 | 3/5/17 | 30000
1 | 1/15/17 | 20000
那么2017年资产编号1的使用量为70000-10000或60000; 但也许您想要70000-20000 = 50000 ...
按年份分组的另一个答案:
SELECT reading.*, max_reading-min_reading used, depid
FROM
( SELECT TRUNC(meterreading_date,'yyyy') meterreading_date, assetnum, MIN(reading) min_reading, MAX(reading) max_reading
FROM METERREADING
GROUP BY TRUNC(meterreading_date,'yyyy'), assetnum
) reading
JOIN
asset ON asset.assetnum=reading.assetnum
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.