从组中获取最后一行,限制 PostgreSQL 中的结果数
Get last row from group, limit number of results in PostgreSQL
我有一个 table,其中的记录代表日志,在此示例中我省略了其余列。
id
-列是自增的,item_id
代表应用中的一个项目。
我需要获取最新的item_id
,例如两个或三个
CREATE TABLE "log" (
"id" INT,
"item_id" INT
);
-- TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 1),
(4, 1),
(5, 3),
(6, 3);
基本查询将列出所有结果,最新的在顶部:
SELECT *
FROM "log"
ORDER BY "id" DESC
id item_id
6 3
5 3
4 1
3 1
2 2
1 1
我只想最后 item_ids 两个 (LIMIT 2) 和他们的 ID。最后意味着 - 最后插入(ORDER BY id)。
id item_id
6 3
4 1
最后三个是
id item_id
6 3
4 1
2 2
一旦 item_id
被 returned,就不会再被 returned。所以 LIMIT 4
将 return 只有三行,因为只有三个唯一的 item_id
.
我可能遗漏了什么。我已经尝试了 DISTINCT OF
、GROUP BY
、LIMIT
等的各种组合
更新#1:
在我测试了 S-man 的查询(如下)之后,我发现它适用于我提供的数据,但它通常不适用于另一组数据(item_id
A、B 和 A 的序列) .).这是另一个数据集:
TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 3),
(5, 1),
(6, 3);
数据库中的数据,按 id
desc:
排序
id item_id
6 3
5 1
4 3
3 3
2 2
1 1
最后三个的预期结果item_id
6 3
5 1
2 2
好了,经过三处改动,现在我们回到第一个想法:
就拿DISTINCT ON
:
SELECT
*
FROM (
SELECT DISTINCT ON (item_id) -- 1
*
FROM log
ORDER BY item_id, id DESC
) s
ORDER BY id DESC -- 2
LIMIT 2
- Returns 正好是有序组的一条记录。你组是
item_id
,顺序是idDESC
,所以你得到每个item_id 的最高id
- 按 id
DESC
重新排序(而不是之前排序的 item_id
)并限制您的查询输出。
我有一个 table,其中的记录代表日志,在此示例中我省略了其余列。
id
-列是自增的,item_id
代表应用中的一个项目。
我需要获取最新的item_id
,例如两个或三个
CREATE TABLE "log" (
"id" INT,
"item_id" INT
);
-- TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 1),
(4, 1),
(5, 3),
(6, 3);
基本查询将列出所有结果,最新的在顶部:
SELECT *
FROM "log"
ORDER BY "id" DESC
id item_id
6 3
5 3
4 1
3 1
2 2
1 1
我只想最后 item_ids 两个 (LIMIT 2) 和他们的 ID。最后意味着 - 最后插入(ORDER BY id)。
id item_id
6 3
4 1
最后三个是
id item_id
6 3
4 1
2 2
一旦 item_id
被 returned,就不会再被 returned。所以 LIMIT 4
将 return 只有三行,因为只有三个唯一的 item_id
.
我可能遗漏了什么。我已经尝试了 DISTINCT OF
、GROUP BY
、LIMIT
等的各种组合
更新#1:
在我测试了 S-man 的查询(如下)之后,我发现它适用于我提供的数据,但它通常不适用于另一组数据(item_id
A、B 和 A 的序列) .).这是另一个数据集:
TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 3),
(5, 1),
(6, 3);
数据库中的数据,按 id
desc:
id item_id
6 3
5 1
4 3
3 3
2 2
1 1
最后三个的预期结果item_id
6 3
5 1
2 2
好了,经过三处改动,现在我们回到第一个想法:
就拿DISTINCT ON
:
SELECT
*
FROM (
SELECT DISTINCT ON (item_id) -- 1
*
FROM log
ORDER BY item_id, id DESC
) s
ORDER BY id DESC -- 2
LIMIT 2
- Returns 正好是有序组的一条记录。你组是
item_id
,顺序是idDESC
,所以你得到每个item_id 的最高id
- 按 id
DESC
重新排序(而不是之前排序的item_id
)并限制您的查询输出。