将 Postgres LAG 与 TEMP table 结合使用

Using Postgres LAG with a TEMP table

在我目前正在开发的移动应用程序中,我在服务器端跟踪有多少访问者 enter/leave 一个或多个 BLE 信标的可见区域。该应用程序传达信标的唯一(字符串)ID 以及事件发生的日期(与 01/04/2021 不同)和 5 分钟时间段。所有这一切最终 - 通过中间的 Redis 交换所 - 在以下 PGSQL table

CREATE TABLE iobeacons (
 "beacon" character varying(24) NOT NULL,
 "tag" integer NOT NULL,
 "slot" smallint NOT NULL,
 "hits" smallint NOT NULL,
 "action" smallint NOT NULL
) WITH (oids = false);

INSERT INTO "iobeacons" ("beacon", "tag", "slot", 
"hits", "action") VALUES
('abc', 1,  1,  5,  -1),
('abc', 1,  2,  4,  -1),
('abc', 1,  1,  15, 1),
('abc', 1,  3,  2,  -1),
('abc', 1,  4,  2,  -1),
('abc', 1,  5,  2,  -1);

完成后,我得到了以下 table

Beacon   Tag   Slot  Hits   Action
----------------------------------
  abc     1      1      5     -1
  abc     1      2      4     -1
  abc     1      1     15      1
  abc     1      3      2     -1
  abc     1      4      2     -1
  abc     1      5      2     -1

据此table我可以推断出以下内容

我需要做的是能够运行 SQL 查询有效地提取此类信息。以问题为例

Find the number of visitors who entered beacon field abc during the 1st 5 minute slot on Day 1 and then left after a stay duration of between 10 & 15 minutes.

SQL 不是我的强项所以到目前为止我能想到的就是这个

CREATE TEMP TABLE hitset(sumhits) AS (select sum(hits) from iobeacons where beacon = 'abc' and tag = 1 and (slot < 2) and (action = 1) UNION select sum(hits) from iobeacons where beacon = 'abc' and tag = 1 and (slot = 2 or slot = 3) and action = -1);

select sumhits,lag(sumhits,1) over (order by sumhits) from hitset;

我正在尝试执行以下操作的地方

到目前为止一切都很好。我得到以下 table

 sumhits
    6
   15

在这里,我 LAG 进入了(对我而言)未知的领域。我试图做的是获取 temp table 两行的 sumhits 列之间的差异。我得到的结果是这个

sumhits    lag
   6       NULL
  15        6

我对 LAG 的不完整理解表明,在上面的第二行中,我应该得到 15(第 2 行)- 6(第 1 行)= 9。为什么这不是结果?


这是我昨天问过的一个问题的改写版本 - 为了清楚起见,经过我自己的努力,改写得相当广泛。

我有点惊讶这里没有得到答案。我留下了我自己的答案的问题。 LAG 只是从前一行中获取一列。必须在 select 中执行针对当前行中相应列的任何算术运算。所以在这种情况下,最后一个 SQL SELECT 应该读作

select sumhits - lag(sumhits,1) over (order by sumhits) from hitset;

您将找到有关使用 LAG here.

执行此类计算的极好参考