2013-08-15 3 views
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 

나는 흐름을 되돌릴 그러나 때문에 (읽기 골 참조) 물 사용량의 양을 계산해야, 3시 반에서 샘플 증가했다 8갤런에 의해 다음 샘플에서 롤백 13 갤런. 어떻게 실제 용수를 계산할 수 있습니까? 다음 그러나 문은 기본적으로 사용하는 표현으로 숫자 범위를 사용하는 나는 시도했다 :

+0

당신은 3시 30 분에 역류 기록을 버리고 싶다고 말하고 있습니까? 실제 사용량은 9 갤런입니까? 또한 SQL Server의 버전은 무엇입니까? –

답변

0

한 가지 방법은 날짜와 시간을 얻을 수 있습니다 어떤 도움이 많이 주시면 감사하겠습니다

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

    FROM dbo.Database 
WHERE (dbf_DT > DATEADD(HH, -24, getdate())) 
... 기간 내의 마지막 읽기 및 해당 기간 (또는 기간 시작 전 마지막 읽기)의 첫 번째 읽기 날짜 및 시간을 입력 한 다음이를 사용하여 행을 검색하십시오.
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 

합니다 (MIN과 MAX 집계가 dbf_Dt는 해당 시리얼에 대해 고유합니다 보장이 있다면 필요하지 않습니다. (시리얼, dbf_DT)에 고유 제한 조건이있을 경우, MIN과 MAX 제거 할 수 있습니다 , 그들은 단지 일치하는 first_read_dt 또는 last_read_dt 더 이상의 행이 경우에이 차별한다.

또 다른 방법은 같은 일을 수행하기 위해 SQL 서버에서 사용할 수 분석 함수를 사용하는 것입니다.

+0

대단히 감사합니다.이 솔루션은 완벽하게 작동했습니다. – MikeT

0

하는 경우 당신은 각각의 독서 사이의 차이점을 요약하려고합니다. 그런 다음 공통 표 E를 사용하여 할 수 있습니다. xpression 및 Windowing 함수 (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 서버에서 작동하는이 위의 행 번호를 사용하고, 자기가 가입 않습니다 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 이상에서 작동해야합니다.

관련 문제