如果前一个行的值大于最大值,则减去该值

时间:2018-12-18 10:49:23

标签: postgresql sequelize.js

我正在使用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 :(得分:2)

您可以使用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