返回每组中具有最新时间戳的行

JBe*_*Fat 1 sql postgresql greatest-n-per-group

我有一个表(Postgres 9.3)定义如下:

 CREATE TABLE tsrs (
     id SERIAL PRIMARY KEY,
     customer_id INTEGER NOT NULL REFERENCES customers,
     timestamp TIMESTAMP WITHOUT TIME ZONE,
     licensekeys_checksum VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)

这里的相关细节是 the customer_id、 thetimestamp和 the licensekeys_checksum。可以有多个具有相同的条目customer_id,其中一些可能具有匹配的licensekey_checksum条目,有些可能不同。永远不会有具有相同校验和和相同时间戳的行。

我想返回一个表,其中包含具有匹配条目的每组行的 1 行licensekeys_checksum。为每个组返回的行应该是具有最新/最近时间戳的行。

输入示例:

 CREATE TABLE tsrs (
     id SERIAL PRIMARY KEY,
     customer_id INTEGER NOT NULL REFERENCES customers,
     timestamp TIMESTAMP WITHOUT TIME ZONE,
     licensekeys_checksum VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)

期望的输出:

1, 2, 2014-08-21 16:03:35, 3FF2561A
2, 2, 2014-08-22 10:00:41, 3FF2561A
2, 2, 2014-06-10 10:00:41, 081AB3CA
3, 5, 2014-02-01 12:03:23, 299AFF90
4, 5, 2013-12-13 08:14:26, 299AFF90
5, 6, 2013-09-09 18:21:53, 49FFA891
Run Code Online (Sandbox Code Playgroud)

我根据下面的评论以及在互联网上搜索的时间,设法拼凑出一个查询。:)

select * from tsrs
inner join (
   select licensekeys_checksum, max(timestamp) as mts
   from tsrs
   group by licensekeys_checksum
   ) x on x.licensekeys_checksum = tsrs.licensekeys_checksum
      and x.mts = tsrs.timestamp;
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我不确定。我走在正确的轨道上吗?

Erw*_*ter 5

您在问题中的查询应该比(之前)接受的答案中的查询执行得更好。测试用EXPLAIN ANALYZE.

DISTINCT ON通常更简单、更快:

SELECT DISTINCT ON (licensekeys_checksum) *
FROM   tsrs
ORDER  BY licensekeys_checksum, timestamp DESC NULLS LAST;
Run Code Online (Sandbox Code Playgroud)

db<>在这里
摆弄旧的sqlfiddle

详细解释: