X-Original-To: pgsql-sql-postgresql.org@postgresql.org Received: from localhost (mx1.hub.org [200.46.208.251]) by postgresql.org (Postfix) with ESMTP id C5C5E9FA42B for ; Wed, 21 Jun 2006 12:22:10 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.208.251]) (amavisd-new, port 10024) with ESMTP id 03531-08 for ; Wed, 21 Jun 2006 12:21:58 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey- Received: from tomts13-srv.bellnexxia.net (tomts13.bellnexxia.net [209.226.175.34]) by postgresql.org (Postfix) with ESMTP id BF7199FA19B for ; Wed, 21 Jun 2006 12:21:57 -0300 (ADT) Received: from acer.sympatico.ca ([70.49.13.156]) by tomts13-srv.bellnexxia.net (InterMail vM.5.01.06.13 201-253-122-130-113-20050324) with ESMTP id <20060621152152.KSBL29052.tomts13-srv.bellnexxia.net@acer.sympatico.ca> for ; Wed, 21 Jun 2006 11:21:52 -0400 Message-Id: <5.2.1.1.0.20060621111608.00abcdb0@pop6.sympatico.ca> X-Sender: b1wudu74@pop6.sympatico.ca X-Mailer: QUALCOMM Windows Eudora Version 5.2.1 Date: Wed, 21 Jun 2006 11:21:36 -0400 To: pgsql-sql@postgresql.org From: Frank Bax Subject: Re: Displaying first, last, count columns In-Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; format=flowed X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200606/237 X-Sequence-Number: 25473 At 10:55 AM 6/21/06, Worky Workerson wrote: >I'm having a bit of a brain freeze and can't seem to come up with >decent SQL for the following problem: > >I have a table "t" of the form "time_occurred TIMESTAMP, prog_data >VARCHAR" and would like to create a query that outputs something of >the form "first_seen, last_seen, count, prog_data". > >I have the current query which gets the first_seen and last_seen via >subqueries, ala > >SELECT t1.time_occurred AS first_seen, t2.time_occurred AS last_seen, >t3.count, t1.prog_data >FROM t AS t1, t AS t2 >WHERE t1.prog_data = t2.prog_data > AND t1.time_occurred IN (SELECT min(time_occurred) FROM t WHERE >prog_data = t1.prog_data) > AND t2.time_occurred IN (SELECT max(time_occurred) FROM t WHERE >prog_data = t1.prog_data) > >but I can't seem to work out how to get the count of all the records >that have. I figure that this is probably a relatively common idiom >... can anyone suggest ways to go about doing this. Also, the >performance of this is pretty horrible, but I figure that creating a >column on t.prog_data should speed things up noticably, right? Is this what you're looking for? SELECT min(time_occurred) AS first_seen, max(time_occurred) AS last_seen, count(*), prog_data from t group by prog_data; Since this query has no WHERE or HAVING clause, this query will read the entire table. There is nothing you can do to speed it up. If you have enough RAM to hold the entire table (and appropriate setting to utilize it), then a second (and subsequent) run of the query will be faster than the first, but that's as good as it gets.