将 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我可以推断出以下内容
- 15 位访客在第 1 天的前五分钟时间段内进入了信标场
abc
- 其中有 4 人在接下来的五分钟间隔内离开了 信标场
- 每个时段有 2 名访客逗留:10 - 15 分钟、15 - 20 分钟和 > 20 分钟
我需要做的是能够运行 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;
我正在尝试执行以下操作的地方
- 使用名为
sumhits
的列创建临时 table
- 在第 1 天和时隙 1 AND
中插入 table 信标字段 abc 的所有输入“命中”的总和
- 第 1 天和时间段 2 或 3 期间同一信标场的所有现有“命中”总和
到目前为止一切都很好。我得到以下 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.
执行此类计算的极好参考
在我目前正在开发的移动应用程序中,我在服务器端跟踪有多少访问者 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我可以推断出以下内容
- 15 位访客在第 1 天的前五分钟时间段内进入了信标场
abc
- 其中有 4 人在接下来的五分钟间隔内离开了 信标场
- 每个时段有 2 名访客逗留:10 - 15 分钟、15 - 20 分钟和 > 20 分钟
我需要做的是能够运行 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;
我正在尝试执行以下操作的地方
- 使用名为
sumhits
的列创建临时 table
- 在第 1 天和时隙 1 AND 中插入 table 信标字段 abc 的所有输入“命中”的总和
- 第 1 天和时间段 2 或 3 期间同一信标场的所有现有“命中”总和
到目前为止一切都很好。我得到以下 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.