0

我正在计算水流量,遇到了情况需要帮助。

Date/Time  Account   Read
---------  --------  -----
04:00.0    16887084  38665
03:30.0    16887084  38652 **<< Reverse flow**
03:00.0    16887084  38660
02:30.0    16887084  38656

我需要计算用水量(如 Read Col 所示),但是由于逆流,03:30 的样品回滚了 8 加仑,而下一个样品增加了 13 加仑。如何计算真实用水量?我尝试了以下方法,但该语句基本上使用数字范围作为使用的表示:

SELECT  serial AS Account,
    max(READ)- min(READ) AS GalsTotal,

    FROM dbo.Database 
WHERE (dbf_DT > DATEADD(HH, -24, getdate())) 

任何帮助将非常感激...

4

2 回答 2

0

一种方法是获取周期内最后一次读数的日期和时间,以及周期内第一次读数(或周期开始前的最后一次读数)的日期和时间,然后用它来检索行.

SELECT s.serial AS Account
     , MAX(lr.READ) - MIN(fr.READ) AS GalsTotal
  FROM (SELECT d.serial
             , MIN(d.dbf_DT) AS first_read_dt
             , MAX(d.dbf_DT) AS last_read_dt
          FROM dbo.Database d
         WHERE d.dbf_DT > DATEADD(HH, -24, GETDATE()
         GROUP BY d.serial
       ) s
  JOIN dbo.Database fr
    ON fr.serial = s.serial 
   AND fr.dbf_DT = s.first_read_dt
  JOIN dbo.Database lr
    ON lr.serial = s.serial 
   AND lr.dbf_DT = s.last_read_dt
 GROUP
    BY s.serial

(如果保证 dbf_Dt 对于给定的序列是唯一的,则不需要 MIN 和 MAX 聚合。如果对 (serial,dbf_DT) 有唯一约束,则可以删除 MIN 和 MAX,它们只是为了区分如果有多个匹配的 first_read_dt 或 last_read_dt 行。

另一种方法是使用 SQL Server 中可用的分析函数来完成同样的事情。

于 2013-08-15T23:50:30.247 回答
0

如果您只是想总结每个读数之间的差异,那么您可以使用公用表表达式和窗口函数 (SQL Server 2012) 或 Row_Number() 来完成。这两个结果都是 9 加仑。有关工作示例,请参阅SQL Fiddle 。

WITH WaterFlow AS (
SELECT 
 serial,
 a.amount_read - LAG(a.amount_read) OVER(PARTITION BY a.serial ORDER BY a.date_read ASC) AS gallons             
FROM useage a
WHERE date_read > DATEADD(HH, -24, getdate())  
)
SELECT 
 serial as account,
 SUM(gallons) AS gallons
FROM WaterFlow
GROUP BY
 serial
;

上面使用了 LAG 窗口功能,可以让您查看上一行,但仅适用于 SQL Server 2012。

WITH WaterFlow AS (
 SELECT 
  serial,
  ROW_NUMBER() OVER (PARTITION BY serial
                           ORDER BY date_read ASC) rn,
  amount_read
 FROM useage
 WHERE date_read > DATEADD(HH, -24, getdate())
)
SELECT 
 a.serial as account,
 SUM(b.amount_read - a.amount_read) as gallons
FROM WaterFlow a
LEFT JOIN WaterFlow b ON 
 a.serial= b.serial
 AND b.rn = a.rn +1  
GROUP BY
 a.serial
;

以上使用行号并执行自连接以获取前一行,并且应该适用于 SQL Server 2005 及更高版本。

于 2013-08-16T17:10:58.297 回答