Sorry my last post isnt complete. This would have to be part of a sub select. It would be more lilke:
SELECT * from cities LEFT OUTER JOIN (SELECT c.id as city_id, event.id FROM cities c LEFT OUTER JOIN events e ON (c.id = e.city_id) WHERE c.id = cities.id ORDER BY e.date DESC LIMIT 2) as x ON (cities.id = x.city_id) I think that would work. Seb On 8/28/07, Sebastian Ritter <[EMAIL PROTECTED]> wrote: > > Hi There, > > You can do something like : > > SELECT * FROM cities c LEFT OUTER JOIN events e ON (c.id =e.city_id) ORDER > BY e.date DESC LIMIT 2 > > The left outer join here would ensure that cities with no events are also > added to your result set. > > Seb > > On 8/28/07, Guy Fraser <[EMAIL PROTECTED]> wrote: > > > > Hi there > > > > I have a list of events that take place in a certain city at a > > certain date. Now I would like to have the first two (ordered by > > date) events for each city. > > Is there a way to do this with one query? > > I am using PostgreSQL 7.4. > > > > Thanks for any tips. > > > > Claudia > > > > > > I think I may have come up with a possible solution. > > > > Create a selection that produces a unique identifier for each city > > ordered by date then use array_accum to collect the unique identifiers > > for each city, then match the first two elements of the array with the > > identifiers. > > > > For instance if you had a table : > > > > CREATE TABLE crazy_talk ( > > ct_id bigserial primary key, > > ct_city text, > > ct_date date, > > ct_data text > > ) ; > > > > Then you could use : > > > > SELECT > > ct_id , > > ct_city , > > ct_date , > > ct_data > > FROM > > crazy_talk , > > (SELECT > > ct_city AS city, > > array_accum(ct_id) as match > > FROM > > crazy_talk > > ORDER BY > > ct_city , > > ct_date > > GROUP BY > > ct_city ) AS data_set > > WHERE > > ct_city = city AND > > ct_id IN (match[0],match[1]) > > ORDER BY > > ct_city , > > ct_date > > ; > > > > I hope this helps, I did not try it, but I think it should work. > > > > PS if you don't have array_accum here it is : > > > > CREATE AGGREGATE array_accum ( > > BASETYPE = anyelement, > > SFUNC = array_append, > > STYPE = anyarray, > > INITCOND = '{}' > > ); > > > > > > > > > > ---------------------------(end of broadcast)--------------------------- > > TIP 5: don't forget to increase your free space map settings > > > >