我试图在连接表上执行GROUP BY。连接表基本上是这样的:无法执行Postgres组的非ID列以获取包含最大值的ID
CREATE TABLE user_foos (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
foo_id INT NOT NULL,
effective_at DATETIME NOT NULL
);
ALTER TABLE user_foos
ADD CONSTRAINT user_foos_uniqueness
UNIQUE (user_id, foo_id, effective_at);
我想查询该表中查找所有记录中,其中effective_at
是给定的任何一对user_id, foo_id
最大值。我已经试过如下:
SELECT "user_foos"."id",
"user_foos"."user_id",
"user_foos"."foo_id",
max("user_foos"."effective_at")
FROM "user_foos"
GROUP BY "user_foos"."user_id", "user_foos"."foo_id";
不幸的是,这会导致错误:
column "user_foos.id" must appear in the GROUP BY clause or be used in an aggregate function
据我所知,这个问题涉及到“ID”没有在聚合函数和数据库使用如果它找到多个具有不同ID的记录,就不知道该怎么办,但我知道由于这些列的三元主键(user_id
,foo_id
和effective_at
),这绝不会发生。
要解决这个问题,我也尝试了一些其他变体,如在id
使用first_value
window function的:
SELECT first_value("user_foos"."id"),
"user_foos"."user_id",
"user_foos"."foo_id",
max("user_foos"."effective_at")
FROM "user_foos"
GROUP BY "user_foos"."user_id", "user_foos"."foo_id";
和:
SELECT first_value("user_foos"."id")
FROM "user_foos"
GROUP BY "user_foos"."user_id", "user_foos"."foo_id"
HAVING "user_foos"."effective_at" = max("user_foos"."effective_at")
不幸的是,这些都导致不同错误:
window function call requires an OVER clause
理想情况下,我的目标是获取所有匹配id
's,以便我可以在子查询中使用它来从此表中提取合法的全行数据以匹配记录。任何人都可以提供有关如何让这项工作的见解?
不幸的是,这最终是通过一个Web服务器上的ORM(使用Rails),所以我需要将它限制为单个查询。任何没有引用'QUERY ABOVE'的方式来做到这一点,即作为一个单一的查询? – 2015-02-05 19:27:16
我认为kordirko在他的回答中拼出来了。 – 2015-02-05 19:39:35