Функция окна Postgres с использованием групп и лагов и других возможных способов - PullRequest
0 голосов
/ 15 ноября 2018

Предположим, у меня есть таблица ниже, и я хотел бы вернуть только те строки, где Price! = Цена в предыдущей строке, но только внутри группы, где группировка по времени

ID :           {    1   ,  2      ,      3   ,    4    ,    5    ,    6 }

Time        : { 09:20:00, 09:20:00,  09:20:00, 09:20:01, 09:20:02, 09:20:03 }

Price :       {   100   , 100     ,  101     , 102     ,   102   ,   103 }

Из-за группировки по времени возвращаемое значение должно быть:

ID                   : {   1     ,    3    ,    4    ,   5      ,  6 }
Time                 : { 09:20:00, 09:20:00, 09:20:01, 09:20:02 , 09:20:03 }
Price :                {   100   ,  101    ,  102     , 102     , 103 }

Обратите внимание, что выходные данные отбрасывают одну из цены 100 в 09:20, но не сбрасывают цену 102 в 09:20:02, даже если она совпадает с ценой в 09:20:01, поскольку необходимо выполнить группировку по времени Может кто-нибудь помочь мне с запросом postgres для чего-то вроде этого.

1 Ответ

0 голосов
/ 15 ноября 2018
SELECT time, price
FROM mytable
WHERE price <> coalesce(
                  lag(price) OVER (PARTITION BY time ORDER BY id),
                  price - 1
               )
ORDER BY time, id;

coalesce заботится о значении NULL, которое появляется для первого элемента в каждом разделе.

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