从组中获取最后一行,限制 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 OFGROUP BYLIMIT 等的各种组合


更新#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:

demo:db<>fiddle

SELECT
    *
FROM (
    SELECT DISTINCT ON (item_id)   -- 1
        *
    FROM log
    ORDER BY item_id, id DESC
) s
ORDER BY id DESC                   -- 2
LIMIT 2
  1. Returns 正好是有序组的一条记录。你组是item_id,顺序是idDESC,所以你得到每个item_id
  2. 的最高id
  3. 按 id DESC 重新排序(而不是之前排序的 item_id)并限制您的查询输出。