pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Michael Glaesemann <grzm@seespotcode.net>
To: Joel Richard <postgres@joelrichard.com>
Cc: D'Arcy J.M. Cain <darcy@druid.net>
Cc: Claudia Kosny <ckosny@gmx.net>
Cc: sql pgsql <pgsql-sql@postgresql.org>
Subject: Re: fetch first rows of grouped data
Date: Mon, 27 Aug 2007 13:12:48 -0500
Message-ID: <60F656A0-805D-4C3B-BCA5-742AC6C866E0@seespotcode.net> (raw)
In-Reply-To: <4CB5D209-C0CC-466E-A967-E766D6AD799B@joelrichard.com>
References: <46D2FD9F.3020000@gmx.net>
	<20070827125102.e52b43de.darcy@druid.net>
	<4CB5D209-C0CC-466E-A967-E766D6AD799B@joelrichard.com>

[Please don't top post as it makes the discussion more difficult to  
follow.]

On Aug 27, 2007, at 12:34 , Joel Richard wrote:

>
> On Aug 27, 2007, at 12:51 PM, D'Arcy J.M. Cain wrote:
>
>> On Mon, 27 Aug 2007 18:36:47 +0200
>> Claudia Kosny <ckosny@gmx.net> wrote:
>>> 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.
>>
>> I believe you are looking for the LIMIT keyword.  Check the docs  
>> on the
>> web site.

> That's what I thought at first, but this is not the case. She's  
> looking for the first two dates in -each- city in the table. I  
> initially thought that this could be accomplished with GROUP BY and  
> LIMIT, but GROUP BY can only give you the first date for each city,  
> not the first two dates for each city.
>
> So far, I haven't come up with any clever ideas. I'm not sure this  
> can be done in SQL.
>
> --Joel
>

I can't think of an easy way to do it, but certainly can do it in SQL  
using correlated subqueries, something like

select city, event, event_date, (
     select count(event)
     from events i
     where i.city = o.city
         and i.event_date < o.event_date
         and event_date > current_date -- make sure they're future  
events
         ) as nearness_rank
from events o
where event_date > current_date -- make sure they're future events
having nearness_rank <= 1;

Note that this can potentially show more than 2 events if the most  
recent upcoming events "tie" (have the same event_date).

Michael Glaesemann
grzm seespotcode net





view thread (9+ messages)  latest in thread

Message-ID: <60F656A0-805D-4C3B-BCA5-742AC6C866E0@seespotcode.net>
Permalink:  ../60F656A0-805D-4C3B-BCA5-742AC6C866E0@seespotcode.net/
Also on:    postgresql.org/message-id/60F656A0-805D-4C3B-BCA5-742AC6C866E0@seespotcode.net

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: grzm@seespotcode.net, postgres@joelrichard.com, darcy@druid.net, ckosny@gmx.net
  Subject: Re: fetch first rows of grouped data
  In-Reply-To: <60F656A0-805D-4C3B-BCA5-742AC6C866E0@seespotcode.net>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox