我正在处理一个 Postgres 表(称为“ live”) ,其中包含的记录的列包括 time _ 戳、 usr _ id、 transaction _ id 和 live _ rest。我需要一个查询,它将为我提供每个 usr _ id 的最新剩余生命总数
例如:
time_stamp|lives_remaining|usr_id|trans_id ----------------------------------------- 07:00 | 1 | 1 | 1 09:00 | 4 | 2 | 2 10:00 | 2 | 3 | 3 10:00 | 1 | 2 | 4 11:00 | 4 | 1 | 5 11:00 | 3 | 1 | 6 13:00 | 3 | 3 | 1
因为我需要访问每个给定 usr _ id 的最新数据所在行的其他列,所以我需要一个查询,其结果如下:
time_stamp|lives_remaining|usr_id|trans_id ----------------------------------------- 11:00 | 3 | 1 | 6 10:00 | 1 | 2 | 4 13:00 | 3 | 3 | 1
正如前面提到的,每个 usr _ id 可以获得或失去生命,有时这些时间戳事件发生的时间如此接近,以至于它们具有相同的时间戳!因此,这个查询不起作用:
SELECT b.time_stamp,b.lives_remaining,b.usr_id,b.trans_id FROM
(SELECT usr_id, max(time_stamp) AS max_timestamp
FROM lives GROUP BY usr_id ORDER BY usr_id) a
JOIN lives b ON a.max_timestamp = b.time_stamp
相反,我需要同时使用 time _ 戳(first)和 trans _ id (second)来标识正确的行。然后,我还需要将该信息从子查询传递到主查询,主查询将为适当行的其他列提供数据。这就是我要解决的问题:
SELECT b.time_stamp,b.lives_remaining,b.usr_id,b.trans_id FROM
(SELECT usr_id, max(time_stamp || '*' || trans_id)
AS max_timestamp_transid
FROM lives GROUP BY usr_id ORDER BY usr_id) a
JOIN lives b ON a.max_timestamp_transid = b.time_stamp || '*' || b.trans_id
ORDER BY b.usr_id
好吧,这样行得通,但我不喜欢。它需要查询中的一个查询,即一个自连接(self join) ,而且在我看来,通过获取 MAX 发现时间戳和 trans _ id 最大的行,可能会简单得多。表“ live”有数千万行需要解析,因此我希望这个查询尽可能快和高效。我对 RDBM 和 Postgres 尤其是新手,所以我知道我需要有效地使用适当的索引。我对如何优化有点迷茫。
我发现了一个类似的讨论 给你。我可以执行一些相当于 Oracle 解析函数的 Postgres 类型吗?
任何关于访问聚合函数(如 MAX)使用的相关列信息、创建索引和创建更好的查询的建议都将非常感谢!
另外,您可以使用以下内容创建我的示例案例:
create TABLE lives (time_stamp timestamp, lives_remaining integer,
usr_id integer, trans_id integer);
insert into lives values ('2000-01-01 07:00', 1, 1, 1);
insert into lives values ('2000-01-01 09:00', 4, 2, 2);
insert into lives values ('2000-01-01 10:00', 2, 3, 3);
insert into lives values ('2000-01-01 10:00', 1, 2, 4);
insert into lives values ('2000-01-01 11:00', 4, 1, 5);
insert into lives values ('2000-01-01 11:00', 3, 1, 6);
insert into lives values ('2000-01-01 13:00', 3, 3, 1);