2014-09-26 54 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