2014-09-26 3 views
1

과의 차이 값을 결정 나는 다음과 같은 테이블이 있습니다롤오버

id | location_id | datetime   | value1 | value2 
--------------------------------------------------------- 
    1 |   123 | 2014-09-01 00:00:00 | 10000 | 5000 
    2 |   123 | 2014-09-01 00:05:00 | 15000 | 10000 
    3 |   123 | 2014-09-01 00:10:00 | 20000 | 15000 
    4 |   123 | 2014-09-01 00:15:00 | 25000 | 20000 
    5 |   123 | 2014-09-01 00:20:00 | 5000 | 1000 
    6 |   123 | 2014-09-01 00:25:00 | 10000 | 5000 
        ..... 
99 |   123 | 2014-09-01 23:55:00 | 90000 | 30000 
100 |   123 | 2014-09-02 00:00:00 | 95000 | 35000 
    x |   123 | 2014-09-02 00:05:00 | 100000 | 40000 
        ..... 
    x |   999 | 2014-09-01 00:00:00 | 50000 | 30000 
    x |   999 | 2014-09-01 00:05:00 | 55000 | 35000 

열은 항상 롤오버가 발생하는 경우를 제외하고, 주어진 location_id에 대한 증가 값은 (이 경우 값이 다시 0에서 시작)를

이 테이블에는 수백 개의 서로 다른 location_ids에 대해 5 분마다 행이 있습니다. ID 5에서 시작하는 값 열에 롤오버가 있음을 확인하십시오.

각 날짜의 값 열에 각 날짜의 차이가 나타나기를 원합니다 (예 :/2014-08-01 - 2014-09-01).

2014-09-01 날짜에 location_id 123에 원하는 값을 얻으려면 롤오버를 고려해야합니다.

90000 (row id 99 - ending value) + 25000 (row id 4 - rollover value) - 10000 (row id 1 - starting value) = 105000 

이 결과는 다음과 같이 보일 것입니다 :

location_id | date  | value1 | value2 
------------------------------------------ 
     123 | 2014-09-01 | 105000 | 45000 
     123 | 2014-09-02 | 90000 | 50000 
     123 | 2014-09-03 | 70000 | 35000 
     999 | 2014-09-01 | 100000 | 90000 
     999 | 2014-09-02 | 80000 | 60000 
     999 | 2014-09-03 | 70000 | 50000 

이 결과에 지정된 각 날짜, 각 location_id에 대한 매일의 차이를 보여줄 것이다 그것은 (예제로 사용하여 값 1)이 될 것입니다 질문.

공격 방법에 대한 아이디어가 있으십니까?

답변

1

롤오버 값이 항상 적을 것으로 가정하고 있습니다.

이 쿼리는 날짜로 값을 row_number으로 지정하고 조건부 집계를 사용하여 마지막, 첫 번째 및 롤오버 값을 더하거나 뺍니다.

select 
    location_id, 
    date(datetime) date, 
    sum(case 
     when rn_datetime_desc = 1 then value1 
     when rn_datetime_asc = 1 then (value1 * -1) 
     when next_value1 < value1 then value1 
     else 0 
     end) value1 
from (
    select 
     location_id, datetime, value1 
     lead(value1) over (partition by date(datetime) order by datetime asc) next_value1, 
     row_number() over (partition by date(datetime) order by datetime asc) rn_datetime_asc, 
     row_number() over (partition by date(datetime) order by datetime desc) rn_datetime_desc 
    from mytable order by datetime asc 
) t1 
group by location_id, date(datetime) 
+0

감사합니다. value2의 동일한 처리를 설명하기 위해 중복 섹션을 추가했으며 잘 작동합니다. – krunchyklown