【发布时间】:2013-07-05 21:17:01
【问题描述】:
我有两个如下所述的表:
CREATE TABLE categories
(
id integer NOT NULL,
category integer NOT NULL,
name text,
CONSTRAINT kjhfskfew PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
CREATE TABLE products_
(
id integer NOT NULL,
date date,
id_employee integer,
CONSTRAINT grh PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
现在我必须做报告,其中需要以下信息: categories.category, categories.name (所有这些,所以 string_agg 是可以的) - 可以很多分配给一个类别和 products_.id_employee -> 但不是像上面那样用逗号和类别名称,而是分配了最新日期的那个(在这里是我的问题);
我已经尝试过如下构造:
SELECT
DISTINCT ON (category ) category,
string_agg(name, ','),
(SELECT
id_employee
FROM products_
WHERE date = (SELECT
max(date)
FROM products_
WHERE id IN (SELECT
id
FROM categories
WHERE id = c.id)))
FROM categories c
ORDER BY category;
但是 PostgreSQL 说子查询返回到很多行... 请帮忙!
示例插入:
INSERT INTO categories(
id, category, name)
VALUES (1,22,'car'),(2,22,'bike'),(3,22,'boat'),(4,33,'soap'),(5,44,'chicken');
INSERT INTO products_(
id, date, id_employee)
VALUES (1,'2009-11-09',11),(2,'2010-09-09',2),(3,'2013-01-01',4),(5,'2014-09-01',90);
好的,我已经解决了这个问题。 这个很好用:
WITH max_date AS (
SELECT
category,
max(date) AS date,
string_agg(name, ',') AS names
FROM test.products_
JOIN test.categories c
USING (id)
GROUP BY c.category
)
SELECT
max(id_employee) AS id_employee,
md.category,
names
FROM test.products_ p
LEFT JOIN max_date md
USING (date)
LEFT JOIN test.categories
USING (category)
WHERE p.date = md.date AND p.id IN (SELECT
id
FROM test.categories
WHERE category = md.category)
GROUP BY category, names;
【问题讨论】:
-
如果您有机会为示例数据行添加一些
INSERT命令以及您希望从该示例数据中看到的结果摘要,这将有助于使此类事情成为更容易回答。 -
当然,我刚刚更新了我的帖子。
-
你想达到什么目的不清楚。你能解释一下吗?
-
我需要按类别对行进行分组。对于每个类别(本例中有 3 个 - 22,33 和 44)我需要显示类别表中的名称,因此类别 22 将是:“汽车”、“自行车”和“船”。第三件事是 id_employee 分配给 products_ 表中的 id -> 并且 ihis id_employee 应该是 max(date) - 所以从类别中分配给类别的最大日期。按 22 类别应该是 4,因为日期 '2013-01-01' 是最大的。
-
我失败了,所以看看类别和产品是如何相关的。
categories表中的id和category列有什么区别?
标签: sql join postgresql-9.2