Re: GROUP BY or alternative means to group

Поиск
Список
Период
Сортировка
От Alexander Reichstadt
Тема Re: GROUP BY or alternative means to group
Дата
Msg-id F1A8DEE3-9299-46FD-9362-1DCA45954054@mac.com
обсуждение исходный текст
Ответ на Re: GROUP BY or alternative means to group  (Bartosz Dmytrak <bdmytrak@eranet.pl>)
Список pgsql-general
Thanks, I just posted my response to my own question for the archives. I take it also that group by is faster than distinct on. If it is a substantial performance gain I have to work on this some more. A subquery I would expect would be much of a drag, so for all keystroke-updated list-tables this would not be suitable I think.



Am 12.03.2012 um 21:57 schrieb Bartosz Dmytrak:

Hi,
You can use one of windowing function:
this could be rank() in subquery or first_value(vale any), but there could be performance issue

another solution could be boolean flag "default" in table address_reference which should be unique for single company, I mean value true should be unique - this could be reached by unique partial index on column refid_companies with condition default = true

hope Your pg version supports windowing functions (as I remember 8.4 and above)

Of course there is a solution with subquery which finds min id in table addresses of each refid_companies in table addresses_reference and this subquery is joined with companies table, but I am afraid this is not the best one.

Regards,
Bartek


2012/3/12 Alexander Reichstadt <lxr@mac.com>
Hi,

the following statement worked on mysql but gives me an error on postgres:

column "addresses.address1" must appear in the GROUP BY clause or be used in an aggregate function

I guess I am doing something wrong. I read the web answers, but none of them seem to meet my needs:

SELECT companies.id,companies.name,companies.organizationkind,addresses.address1,addresses.address2,addresses.city,addresses.zip FROM companies JOIN addresses_reference ON companies.id=addresses_reference.refid_companies LEFT JOIN addresses ON addresses_reference.refid_addresses=addresses.id GROUP BY companies.id;


What I did now was create a view based on above statement but without grouping. This returns a list with non-distinct values for all companies that have more than one address, which is correct. But in some cases I only need one address and the problem is that I cannot use distinct.

I wanted to have some way to display a companies list that only gives me the first stored addresses related, and disregard any further addresses.

Is there any way to do this?

Thanks
Alex


В списке pgsql-general по дате отправления:

Предыдущее
От: Kiriakos Georgiou
Дата:
Сообщение: Re: GROUP BY or alternative means to group
Следующее
От: Scott Marlowe
Дата:
Сообщение: Re: GROUP BY or alternative means to group