2014-09-26 36 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,當滾動發生,除了值(在這種情況下,值再次從零開始)

該表格每隔5分鐘將有一行數百個不同的location_id。 請注意,從值爲5開始的值列中存在翻轉。

我希望獲得每個location_id的每個值的列值的差異,給定一組日期(ex/2014-08-01 - 2014年9月1日)。

要獲得2014-09-01日期的location_id 123的所需值,我需要考慮翻轉。這將是(用value1爲例):

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

我假設翻轉後的值總是會更小。

此查詢使用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 2014-09-29 16:19:27