У меня есть две таблицы, описанные ниже:Объединение двух таблиц с агрегатами
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 в порядке) - может быть много назначено одной категории и product_.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' для строк данных образцов и резюме результатов вы хотели бы видеть из этого образца данных, помог бы сделать такого рода вещи гораздо легче ответить. –
уверен, я только что обновил свой пост. – Borys
Чего вы хотите достичь, неясно. Вы можете объяснить? – chetan