Вычтите значение из предыдущего значения строки, если оно больше максимального значения - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Postgresql & Sequelize.Я должен найти потребление из таблицы чтения.В настоящее время у меня есть запрос вычесть значение из предыдущей строки.Но проблема была в том, что если значение меньше, чем предыдущее, это означает, что я должен игнорировать строку и ждать, пока большее значение будет выполнено для расчета.

Текущий запрос

select "readingValue",
       "readingValue" - coalesce(lag("readingValue") over (order by "id")) as consumption
from public."EnergyReadingTbl";

Пример записи и токового выхода

id      readingValue        consumption

65479   "35.8706703186035"  "3.1444168090820"
65480   "39.0491638183594"  "3.1784934997559"
65481   "42.1287002563477"  "3.0795364379883"
65482   "2.38636064529419"  "-39.74233961105351"
65483   "5.91744041442871"  "3.53107976913452"
65484   "9.59204387664795"  "3.67460346221924"
65485   "14.3925561904907"  "4.80051231384275"
65486   "19.4217891693115"  "5.0292329788208"
65487   "24.2393398284912"  "4.8175506591797"
65488   "29.2515335083008"  "5.0121936798096"
65489   "34.2519302368164"  "5.0003967285156"
65490   "38.6513633728027"  "4.3994331359863"
65491   "43.7513643778087"  "5.1000010050060"

На этом изображении последнее максимальное значение было 42.1287002563477.Я должен подождать, пока не получу большее значение, чем 42.1287002563477, чтобы сделать расчет как следующее большее значение - 42.1287002563477.В этом случае 43.7513643778087 - 42.1287002563477.

Ожидаемый результат

id      readingValue        consumption

65479   "35.8706703186035"  "3.1444168090820"
65480   "39.0491638183594"  "3.1784934997559"
65481   "42.1287002563477"  "3.0795364379883"
65482   "2.38636064529419"  "0"
65483   "5.91744041442871"  "0"
65484   "9.59204387664795"  "0"
65485   "14.3925561904907"  "0"
65486   "19.4217891693115"  "0"
65487   "24.2393398284912"  "0"
65488   "29.2515335083008"  "0"
65489   "34.2519302368164"  "0"
65490   "38.6513633728027"  "0"
65491   "43.7513643778087"  "1.1226641214710"

Есть ли шанс решить эту проблему в запросе?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете использовать ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING, чтобы ограничить фрейм оконной функции, поэтому вы можете вычесть MAX до текущей строки со значением MAX строк до, но исключая текущую строку:

SELECT readingValue,
       MAX(readingValue) OVER (ORDER BY id) - MAX(readingValue) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
FROM e;

┌──────────────────┬─────────────────┐
│   readingvalue   │    ?column?     │
├──────────────────┼─────────────────┤
│ 35.8706703186035 │          (null) │
│ 39.0491638183594 │ 3.1784934997559 │
│ 42.1287002563477 │ 3.0795364379883 │
│ 2.38636064529419 │               0 │
│ 5.91744041442871 │               0 │
│ 9.59204387664795 │               0 │
│ 14.3925561904907 │               0 │
│ 19.4217891693115 │               0 │
│ 24.2393398284912 │               0 │
│ 29.2515335083008 │               0 │
│ 34.2519302368164 │               0 │
│ 38.6513633728027 │               0 │
│ 43.7513643778087 │  1.622664121461 │
└──────────────────┴─────────────────┘
(13 rows)

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