Отображать только записи, которые увеличились с определенного периода времени - PullRequest
0 голосов
/ 04 апреля 2019

В моей базе данных есть таблица ITEM_POWER, в которую входят ID #, READ_TIME и POWER_COUNT.

Каждый раз, когда элемент выключается, он увеличивает POWER_COUNT + 1 в таблице. Элемент может иметь 0 POWER_COUNT, если он никогда не выключается, или 1000 POWER_COUNT, если он выключен 1000 раз.

Я бы хотел отобразить элементы, у которых значение POWER_COUNT увеличилось на 1 в течение определенного периода времени по сравнению с POWER_COUNT за последний период времени.

В настоящее время мой запрос выглядит примерно так:

SELECT ID, READ_TIME, POWER_COUNT
FROM ITEM_POWER WHERE READ_TIME BETWEEN '31-MAR-19' and '05-APR-19' 
AND POWER_COUNT > POWER_COUNT BETWEEN READ_TIME OF '24-MAR-19' AND '29-MAR-19'
GROUP BY ID, READ_TIME, POWER_COUNT
ORDER BY ID, READ_TIME, POWER_COUNT

Очевидно, я не верю, что моя строка "AND POWER_COUNT> POWER_COUNT МЕЖДУ READ_TIME OF '24 -MAR-19 'И '29 -MAR-19' сработает, это именно то, чего я пытаюсь достичь. Я хочу сравните power_counts этой недели по сравнению с прошлой неделей, и если power_count увеличился, я хочу отобразить READ_TIME и новый POWER_COUNT.

ОБРАЗЕЦ ДАННЫХ:

ID READ_TIME POWER_COUNT
------------ --------- -----------
1234567 09-MAR-19         121
1234567 10-MAR-19         121
1234567 11-MAR-19         121
1234567 12-MAR-19         121
1234567 13-MAR-19         123
1234567 14-MAR-19         130

В приведенных выше данных у ID 1234567 было увеличено значение POWER_COUNT со 121 до 123 в '13 -MAR-19 '. Для этого примера, скажем, я хотел бы сравнить POWER_COUNT между '13 -MAR-19 'и '14 -MAR-19' с POWER_COUNT в '12 -MAR-19 '. Поскольку POWER_COUNT с тех пор увеличился, я бы хотел, чтобы этот идентификатор отображался в моем отчете. Если значение POWER_COUNT не увеличилось по сравнению со значением предыдущей даты, я бы хотел исключить его.

1 Ответ

1 голос
/ 04 апреля 2019

Исходя из ваших данных выборки, вы просто хотите lag():

SELECT ID, READ_TIME, POWER_COUNT
FROM (SELECT IP.*,
             LAG(POWER_COUNT) OVER (PARTITION BY ID ORDER BY READ_TIME) as PREV_POWER_COUNT
      FROM ITEM_POWER IP
     ) IP
WHERE READ_TIME >= DATE '2019-03-21' AND
      READ_TIME < '2019-04-06' AND
      POWER_COUNT <> PREV_POWER_COUNT 
ORDER BY ID, READ_TIME, POWER_COUNT;
...