从组中获取最后一行,限制PostgreSQL中的结果数

从组中获取最后一行,限制PostgreSQL中的结果数,postgresql,greatest-n-per-group,Postgresql,Greatest N Per Group,我有一个包含表示日志的记录的表,在这个示例中我省略了其余的列 id-列是自动递增的,item\u id表示应用程序中的一个项目 我需要获取最新的项目id,例如两个或三个 CREATE TABLE "log" ( "id" INT, "item_id" INT ); -- TRUNCATE TABLE "log"; INSERT INTO "log" ("id"

我有一个包含表示日志的记录的表,在这个示例中我省略了其余的列

id
-列是自动递增的,
item\u id
表示应用程序中的一个项目

我需要获取最新的
项目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
我想有两个(限制2)最后一项的id与他们的id。最后的手段-插入最后(按id排序)

最后三个是

id  item_id
6   3
4   1
2   2
返回
项目\u id
后,不会再次返回该项目。因此
LIMIT 4
将只返回三行,因为只有三个唯一的
item\u id

我可能错过了什么。我已经尝试了不同于、
分组依据
限制
等的各种组合


更新#1: 在我测试了S-man的查询(见下文)之后,我发现它适用于我提供的数据,但通常不适用于另一组数据(序列
item\u 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
最后三个
项目的预期结果\u id

6   3
5   1
2   2

好的,经过三次改变,现在我们回到第一个想法:

只需在上取

  • 返回一个有序组的确切一条记录。您的分组是
    项目\u id
    ,顺序是id
    DESC
    ,因此您可以获得每个项目\u id的最高id
  • 按id重新排序
    DESC
    (而不是以前排序的
    item_id
    ),并限制查询输出

  • 更改了答案,添加了解释我在一个较大的数据集上尝试了您的查询,发现它适用于我提供的一个简单示例,但在较大的数据集上它返回了不需要的结果。我认为原因是,如果再次出现了项目a、B和a的序列,那么查询将再次返回a。我更新了这个问题。坚持住,在走了太多的路之后,在你澄清之后,我突然想到,第一种方法现在是最好的D:D更改了答案,希望是最后一次,您能用限制4显示第一个示例的预期结果吗?正如我现在所理解的:当一个特定的item_id的值被识别一次时,它就不应该再被返回。是吗?是的,你是对的。我更新了问题。如果返回了项目id,则不应再次返回(重复)。如果只有三个唯一的item_id,LIMIT 4(或query without LIMIT)将只返回三行。为什么您要不断更改您的问题?!
    id  item_id
    6   3
    5   1
    4   3
    3   3
    2   2
    1   1
    
    6   3
    5   1
    2   2
    
    SELECT
        *
    FROM (
        SELECT DISTINCT ON (item_id)   -- 1
            *
        FROM log
        ORDER BY item_id, id DESC
    ) s
    ORDER BY id DESC                   -- 2
    LIMIT 2