从组中获取最后一行,限制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
,顺序是idDESC
,因此您可以获得每个项目\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