【发布时间】:2015-06-30 06:25:20
【问题描述】:
我将尽力解释这一点。
下面的代码执行以下操作:
- 从 ServiceLocation 表中查找服务地址。
- 查找服务类型(电或水)。
- 查找过去多少天提取数据。
一旦有了这个,它就会通过从一天的最小抄表量中减去一天的最大抄表量来计算“每日使用量”。
(MAX(mr.Reading) - MIN(mr.Reading)) AS 'DaytimeUsage'
但是,我缺少的是前一天的最大读数和当天的最小读数。从数学上讲,这应该是这样的:
- MAX(PriorDayReading) - MIN(ReadDateReading)
基本上,如果它回到 5 天,它应该踢出一个如下所示的表:
服务地点 |阅读日期 |用法 |
主街 123 号 | 2015 年 4 月 20 日 | 12 |
主街 123 号 | 2015 年 4 月 19 日 | 8 |
主街 123 号 | 2015 年 4 月 18 日 | 6 |
主街 123 号 | 2015 年 4 月 17 日 | 10 |
主街 123 号 | 2015 年 4 月 16 日 | 11 |
“Usage”是我缺少的“DaytimeUsage”+ 用法(以及上面的问题)。例如,4/18/15 将是下面查询中的“DaytimeUsage”加上从 4/17/15 读取的 MAX 与 4/18/15 读取的 MIN 之间的差异。
我不确定如何完成此操作或是否可能。
SELECT
A.ServiceAddress AS 'Service Address',
convert(VARCHAR(10),A.ReadDate,101) AS 'Date',
SUM(A.[DaytimeUsage]) AS 'Usage'
FROM
(
SELECT
sl.location_addr AS 'ServiceAddress',
convert(VARCHAR(10),mr.read_date,101) AS 'ReadDate',
(MAX(mr.Reading) - MIN(mr.Reading)) AS 'DaytimeUsage'
FROM
DimServiceLocation AS sl
INNER JOIN FactBill AS fb ON fb.ServiceLocationKey = sl.ServiceLocationKey
INNER JOIN FactMeterRead as mr ON mr.ServiceLocationKey = sl.ServiceLocationKey
INNER JOIN DimCustomer AS c ON c.CustomerKey = fb.CustomerKey
WHERE
c.class_name = 'Tenant'
AND sl.ServiceLocationKey = @ServiceLocation
AND mr.meter_type = @ServiceType
GROUP BY
sl.location_addr,
convert(VARCHAR(10),
mr.read_date,101)
) A
WHERE A.ReadDate >= GETDATE()-@Days
GROUP BY A.ServiceAddress, convert(VARCHAR(10),A.ReadDate,101)
ORDER BY convert(VARCHAR(10),A.ReadDate,101) DESC
【问题讨论】:
-
我只知道你想获得昨天的最大阅读量和今天的最小阅读量。这可以通过函数之间的日期来实现
-
是的。但是,它需要对日期范围内的每个日期执行此操作。因此,4/16 的最大读取和 4/17 的最小读取之间的差异然后是 4/17 的最大读取和 4/16 的最小读取之间的差异......等等。将这些总和添加到现有的 MIN和查询中每个读取日期的最大读取差异。
标签: sql sql-server datetime max min