2016-01-27 7 views
0

Я использую Postgres 8.4.2, и я пытаюсь сделать запрос, который выбирает некоторые данные, но я получаю неправильные результаты, когда группа по этим нескольким столбцам я выбираю.Как выбрать несколько столбцов в Postgres без группы по всем столбцам

Я попытался не группировать все эти столбцы, но я получаю уведомление, что я должен группировать все выбранные столбцы.

Мой запрос выглядит следующим образом:

SELECT c.id AS category_id, c.parent_id, c.title AS category_title, count(ofrs.id) AS offers_count 
    FROM categories c 
    LEFT JOIN offers_to_categories otc ON c.id = otc.category_id 
    LEFT JOIN offers ofrs ON otc.offer_id = ofrs.id 
    WHERE ofrs.offer_type = 1 AND ofrs.status = 1 
    GROUP BY c.id, c.title, c.parent_id; 

Я хочу, чтобы выбрать подсчитывать предложения по категориям, где offer_type = 1.

Как я мог бы сделать это без группы по нескольким столбцам, но только группа по c.id?

Я пробовал следующую функцию окна, но результат тот же - это показывает мне больше результатов, чем должно быть.

SELECT ofr.id , c.id AS category_id, c.parent_id, c.title AS category_title,ofr.website_id , 
count(ofr.id) 
OVER (PARTITION BY (ofr.id) order BY ofr.id) 
FROM offers AS ofr 
INNER JOIN offers_to_categories AS ofr_cat ON (ofr_cat.offer_id = ofr.id) 
INNER JOIN categories AS c ON (c.id = ofr_cat.category_id) 
WHERE (c.id = 3 or c.parent_id = 3) and ofr.website_id = 1 and ofr.status = 1 
+3

ЗАКАНЧИВАТЬ оконные функции. И вы действительно должны планировать обновление поддерживаемой версии. 8.4 очень старый. Вы должны хотя бы обновиться до последней версии 8.4. –

+0

Теперь я читаю о них - http://www.postgresql.org/docs/8.4/static/tutorial-window.html. Но я не могу понять, как использовать его для группировки только byr.id. Я редактировал свой вопрос. –

+0

Пожалуйста, отредактируйте свой вопрос и добавьте образцы данных и ожидаемый результат –

ответ

1

Я нашел ответ на мой вопрос, и это:

SELECT distinct ON(ofr.id) ofr.id , c.id AS category_id, c.parent_id, c.title AS category_title,ofr.website_id , 
count(ofr.id) 
OVER (PARTITION BY (select distinct on(ofr.id) ofr.id from offers as id GROUP BY ofr.id) order BY ofr.id) 
FROM offers AS ofr 
INNER JOIN offers_to_categories AS ofr_cat ON (ofr_cat.offer_id = ofr.id) 
INNER JOIN categories AS c ON (c.id = ofr_cat.category_id) 
WHERE (c.id = 3 or c.parent_id = 3) and ofr.website_id = 1 and ofr.status = 1