postgresql условная задержка на основе предыдущих значений - PullRequest
0 голосов
/ 06 августа 2020

Я использую postgresql и функцию задержки, чтобы получить предыдущие 2 значения. У меня есть таблица, в которой мне нужно выбрать предыдущие 2 строки, где 'exclude' = 0. Поэтому я не могу использовать строки для лага, где exclude = 1

Вот тестовая установка

with tmp(time,value,exclude)
as (values
('2020-08-05 13:00:00.000',23.1,0),
('2020-08-05 14:00:00.000',22.33,0),
('2020-08-05 15:00:00.000',12.1,1),
('2020-08-05 16:00:00.000',31.1,0),
('2020-08-05 17:00:00.000',53.1,0),
('2020-08-05 18:00:00.000',223.1,0),
('2020-08-05 19:00:00.000',253.1,0),
('2020-08-05 20:00:00.000',2.1,0),
('2020-08-05 21:00:00.000',43.1,0),
('2020-08-05 22:00:00.000',63.1,0),
('2020-08-05 23:00:00.000',3.1,1),
('2020-08-06 00:00:00.000',973.1,1),
('2020-08-06 01:00:00.000',23.1,0),
('2020-08-06 02:00:00.000',13.1,0),
('2020-08-06 03:00:00.000',288.1,0),
('2020-08-06 04:00:00.000',254.1,0),
('2020-08-06 05:00:00.000',234.1,0),
('2020-08-06 06:00:00.000',2546.1,0),
('2020-08-06 07:00:00.000',22.1,0),
('2020-08-06 08:00:00.000',122.1,0),
('2020-08-06 09:00:00.000',14.1,0),
('2020-08-06 10:00:00.000',66.1,0),
('2020-08-06 11:00:00.000',67.1,0),
('2020-08-06 12:00:00.000',23.1,0)
)
select 
"time",
"value",
lag("value",1) over (order by "time" asc) as prev1,
lag("value",2) over (order by "time" asc) as prev2,
"exclude"
from tmp;

Что в настоящее время приводит к:

time                   |value |prev1 |prev2 |exclude|
-----------------------|------|------|------|-------|
2020-08-05 13:00:00.000|  23.1|      |      |      0|
2020-08-05 14:00:00.000| 22.33|  23.1|      |      0|
2020-08-05 15:00:00.000|  12.1| 22.33|  23.1|      1|
2020-08-05 16:00:00.000|  31.1|  12.1| 22.33|      0|
2020-08-05 17:00:00.000|  53.1|  31.1|  12.1|      0|
2020-08-05 18:00:00.000| 223.1|  53.1|  31.1|      0|
2020-08-05 19:00:00.000| 253.1| 223.1|  53.1|      0|
2020-08-05 20:00:00.000|   2.1| 253.1| 223.1|      0|
2020-08-05 21:00:00.000|  43.1|   2.1| 253.1|      0|
2020-08-05 22:00:00.000|  63.1|  43.1|   2.1|      0|
2020-08-05 23:00:00.000|   3.1|  63.1|  43.1|      1|
2020-08-06 00:00:00.000| 973.1|   3.1|  63.1|      1|
2020-08-06 01:00:00.000|  23.1| 973.1|   3.1|      0|
2020-08-06 02:00:00.000|  13.1|  23.1| 973.1|      0|
2020-08-06 03:00:00.000| 288.1|  13.1|  23.1|      0|
2020-08-06 04:00:00.000| 254.1| 288.1|  13.1|      0|
2020-08-06 05:00:00.000| 234.1| 254.1| 288.1|      0|
2020-08-06 06:00:00.000|2546.1| 234.1| 254.1|      0|
2020-08-06 07:00:00.000|  22.1|2546.1| 234.1|      0|
2020-08-06 08:00:00.000| 122.1|  22.1|2546.1|      0|
2020-08-06 09:00:00.000|  14.1| 122.1|  22.1|      0|
2020-08-06 10:00:00.000|  66.1|  14.1| 122.1|      0|
2020-08-06 11:00:00.000|  67.1|  66.1|  14.1|      0|
2020-08-06 12:00:00.000|  23.1|  67.1|  66.1|      0|

Мне нужно что-то вроде этого:

введите описание изображения здесь

Спасибо, Рауно

1 Ответ

0 голосов
/ 07 августа 2020

В итоге я получил что-то вроде этого: Это все еще не совсем то, что я хочу, так как строки "excluded" используют предыдущую строку (даже если excluded = 1)

with tmp(time,value,exclude)
as (values
('2020-08-05 13:00:00.000',23.1,0),
('2020-08-05 14:00:00.000',22.33,0),
('2020-08-05 15:00:00.000',12.1,1),
('2020-08-05 16:00:00.000',31.1,0),
('2020-08-05 17:00:00.000',53.1,0),
('2020-08-05 18:00:00.000',223.1,0),
('2020-08-05 19:00:00.000',253.1,0),
('2020-08-05 20:00:00.000',2.1,0),
('2020-08-05 21:00:00.000',43.1,0),
('2020-08-05 22:00:00.000',63.1,0),
('2020-08-05 23:00:00.000',3.1,1),
('2020-08-06 00:00:00.000',973.1,1),
('2020-08-06 01:00:00.000',23.1,0),
('2020-08-06 02:00:00.000',13.1,0),
('2020-08-06 03:00:00.000',288.1,0),
('2020-08-06 04:00:00.000',254.1,0),
('2020-08-06 05:00:00.000',234.1,0),
('2020-08-06 06:00:00.000',2546.1,0),
('2020-08-06 07:00:00.000',22.1,0),
('2020-08-06 08:00:00.000',122.1,0),
('2020-08-06 09:00:00.000',14.1,0),
('2020-08-06 10:00:00.000',66.1,0),
('2020-08-06 11:00:00.000',67.1,0),
('2020-08-06 12:00:00.000',23.1,0)
)
select 
"time",
"value",
case when "exclude" = 1 then
        lag("value",1) over ( order by  "time" asc)
    else
        lag("value",1) over ( order by  "exclude" , "time" asc) 
    end as prev1_avg,   
case when "exclude" = 1 then
        lag("value",2) over ( order by  "time" asc)
    else
        lag("value",2) over ( order by  "exclude" , "time" asc) 
    end as prev2_avg,

"exclude"
from tmp
order by "time";

это приводит к следующему (но строка 12 неисправна, используются значения строки 11): введите описание изображения здесь

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