SQL: Как получить изменение значения между двумя смежными строками во временном ряду? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть таблица с именем NEW_YORK_TEMPERATURES, например:

Примечание: добавлен интервал для отображения разных мест и дат

datetime,           location, min_temp, max_temp

2018-01-01 12:00:00,  seneca,     76.1,     76.5
2018-01-01 12:10:00,  seneca,     76.1,     76.5
2018-01-01 12:20:00,  seneca,     76.2,     76.6
2018-01-01 12:30:00,  seneca,     76.1,     76.6
2018-01-01 12:40:00,  seneca,     76.1,     76.5

2018-01-02 12:00:00,  seneca,     76.6,     77.3
2018-01-02 12:10:00,  seneca,     76.6,     77.3
2018-01-02 12:20:00,  seneca,     76.6,     77.3
2018-01-02 12:30:00,  seneca,     76.6,     77.3
2018-01-02 12:40:00,  seneca,     76.6,     77.3

2018-01-01 12:00:00, conesus,     66.1,     66.5
2018-01-01 12:10:00, conesus,     66.1,     66.5
2018-01-01 12:20:00, conesus,     66.2,     66.6
2018-01-01 12:30:00, conesus,     66.1,     66.6
2018-01-01 12:40:00, conesus,     66.1,     66.5

2018-01-02 12:00:00, conesus,     66.4,     66.7
2018-01-02 12:10:00, conesus,     66.4,     66.8
2018-01-02 12:20:00, conesus,     66.4,     66.9
2018-01-02 12:30:00, conesus,     66.4,     66.9
2018-01-02 12:40:00, conesus,     66.4,     66.9   

2018-01-01 12:00:00, ontario,     63.1,     63.5
2018-01-01 12:10:00, ontario,     63.1,     63.5
2018-01-01 12:20:00, ontario,     63.2,     63.6
2018-01-01 12:30:00, ontario,     63.1,     63.6
2018-01-01 12:40:00, ontario,     63.1,     63.5

2018-01-02 12:00:00, ontario,     63.3,     63.8
2018-01-02 12:10:00, ontario,     63.3,     63.8    
2018-01-02 12:20:00, ontario,     63.3,     63.8
2018-01-02 12:30:00, ontario,     63.3,     63.7
2018-01-02 12:40:00, ontario,     63.3,     63.7

Мне нужен способ получить разницу в изменениидиапазон между двумя последовательными временными метками.Первый шаг - создать столбец спреда, выполнив:

select 
    datetime, 
    location, 
    min_temp, 
    max_temp, 
    max_temp - min_temp as range 
from NEW_YORK_TEMPERATURES 
order by datetime

Чтобы получить таблицу типа:

datetime,           location, min_temp, max_temp, range

2018-01-01 12:00:00,  seneca,     76.1,     76.5,   0.4
2018-01-01 12:10:00,  seneca,     76.1,     76.5,   0.4
2018-01-01 12:20:00,  seneca,     76.2,     76.6,   0.4
2018-01-01 12:30:00,  seneca,     76.1,     76.6,   0.5
2018-01-01 12:40:00,  seneca,     76.1,     76.5,   0.4

2018-01-02 12:00:00,  seneca,     76.6,     77.3,   0.7
2018-01-02 12:10:00,  seneca,     76.6,     77.3,   0.7
2018-01-02 12:20:00,  seneca,     76.6,     77.3,   0.7
2018-01-02 12:30:00,  seneca,     76.6,     77.3,   0.7
2018-01-02 12:40:00,  seneca,     76.6,     77.3,   0.7

2018-01-01 12:00:00, conesus,     66.1,     66.5,   0.4
2018-01-01 12:10:00, conesus,     66.1,     66.5,   0.4
2018-01-01 12:20:00, conesus,     66.2,     66.6,   0.4
2018-01-01 12:30:00, conesus,     66.1,     66.6,   0.5
2018-01-01 12:40:00, conesus,     66.1,     66.5,   0.4

2018-01-02 12:00:00, conesus,     66.4,     66.7,   0.3
2018-01-02 12:10:00, conesus,     66.4,     66.8,   0.4
2018-01-02 12:20:00, conesus,     66.4,     66.9,   0.5
2018-01-02 12:30:00, conesus,     66.4,     66.9,   0.5
2018-01-02 12:40:00, conesus,     66.4,     66.9,   0.5

2018-01-01 12:00:00, ontario,     63.1,     63.5,   0.4
2018-01-01 12:10:00, ontario,     63.1,     63.5,   0.4
2018-01-01 12:20:00, ontario,     63.2,     63.6,   0.4
2018-01-01 12:30:00, ontario,     63.1,     63.6,   0.5
2018-01-01 12:40:00, ontario,     63.1,     63.5,   0.4

2018-01-02 12:00:00, ontario,     63.3,     63.8,   0.5
2018-01-02 12:10:00, ontario,     63.3,     63.8,   0.5   
2018-01-02 12:20:00, ontario,     63.3,     63.8,   0.5
2018-01-02 12:30:00, ontario,     63.3,     63.7,   0.4
2018-01-02 12:40:00, ontario,     63.3,     63.7,   0.4

Но как я могу получить изменения в диапазоне между соседними барами вто же место, так что мой результат выглядит так:

datetime,           location, min_temp, max_temp, range, change_in_range

2018-01-01 12:00:00,  seneca,     76.1,     76.5,   0.4              nan
2018-01-01 12:10:00,  seneca,     76.1,     76.5,   0.4              0.0
2018-01-01 12:20:00,  seneca,     76.2,     76.6,   0.4              0.0
2018-01-01 12:30:00,  seneca,     76.1,     76.6,   0.5              0.1
2018-01-01 12:40:00,  seneca,     76.1,     76.5,   0.4             -0.1

2018-01-02 12:00:00,  seneca,     76.6,     77.3,   0.7              0.0
2018-01-02 12:10:00,  seneca,     76.6,     77.3,   0.7              0.0
2018-01-02 12:20:00,  seneca,     76.6,     77.3,   0.7              0.0
2018-01-02 12:30:00,  seneca,     76.6,     77.3,   0.7              0.0
2018-01-02 12:40:00,  seneca,     76.6,     77.3,   0.7              0.0

2018-01-01 12:00:00, conesus,     66.1,     66.5,   0.4              nan
2018-01-01 12:10:00, conesus,     66.1,     66.5,   0.4              0.0
2018-01-01 12:20:00, conesus,     66.2,     66.6,   0.4              0.0
2018-01-01 12:30:00, conesus,     66.1,     66.6,   0.5              0.1
2018-01-01 12:40:00, conesus,     66.1,     66.5,   0.4              0.0

2018-01-02 12:00:00, conesus,     66.4,     66.7,   0.3             -0.1
2018-01-02 12:10:00, conesus,     66.4,     66.8,   0.4              0.1
2018-01-02 12:20:00, conesus,     66.4,     66.9,   0.5              0.1
2018-01-02 12:30:00, conesus,     66.4,     66.9,   0.5              0.0
2018-01-02 12:40:00, conesus,     66.4,     66.9,   0.5              0.0

2018-01-01 12:00:00, ontario,     63.1,     63.5,   0.4              nan
2018-01-01 12:10:00, ontario,     63.1,     63.5,   0.4              0.0
2018-01-01 12:20:00, ontario,     63.2,     63.6,   0.4              0.0
2018-01-01 12:30:00, ontario,     63.1,     63.6,   0.5              0.1
2018-01-01 12:40:00, ontario,     63.1,     63.5,   0.4             -0.1

2018-01-02 12:00:00, ontario,     63.3,     63.8,   0.5              0.1
2018-01-02 12:10:00, ontario,     63.3,     63.8,   0.5              0.0
2018-01-02 12:20:00, ontario,     63.3,     63.8,   0.5              0.0
2018-01-02 12:30:00, ontario,     63.3,     63.7,   0.4             -0.1
2018-01-02 12:40:00, ontario,     63.3,     63.7,   0.4              0.0

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы бы использовали lag() с боковым соединением:

select t.*, v.range,
       (range - lag(range) over (partition by location order by datetime)) as change_in_range
from NEW_YORK_TEMPERATURES t cross join lateral
     (values (max_temp - min_temp)) v(range)
order by location, datetime;

Примечание: первые значения для каждого местоположения будут представлены как NULL, а не nan.

Кроме того, для желаемого выхода вы хотите order by location, datetime.

0 голосов
/ 24 сентября 2018

Так как кажется, что вы хотите разделить "диапазон разницы" как по дате (усеченной из поля datetime) , так и по , вам необходимо добавить усеченную дату к вашему LAG функция.Используя CTE, вы получите что-то вроде этого:

    WITH temps_with_ranges AS
    (
        SELECT *, 
            date_trunc('day', datetime) AS dt, 
            max_temp - min_temp AS "range"
        FROM NEW_YORK_TEMPERATURES
    )
SELECT * , "range" - LAG("range") OVER (PARTITION BY location, dt ORDER BY datetime)
FROM temps_with_ranges
0 голосов
/ 24 сентября 2018

Один вариант использует LAG:

SELECT 
    datetime,
    location,
    min_temp,
    max_temp,
    max_temp - min_temp AS range,
    (max_temp - min_temp) - LAG(max_temp - min_temp) OVER
        (PARTITION BY location ORDER BY datetime) change_in_range
FROM NEW_YORK_TEMPERATURES 
ORDER BY
    location, datetime;

enter image description here

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...