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)
这似乎有效,但我不确定。我走在正确的轨道上吗?
您在问题中的查询应该比(之前)接受的答案中的查询执行得更好。测试用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)
详细解释:
| 归档时间: |
|
| 查看次数: |
4936 次 |
| 最近记录: |