From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | dgreer(at)websightsolutions(dot)com |
Cc: | pgsql-sql(at)postgreSQL(dot)org |
Subject: | Re: [SQL] Trouble with massive select statement. |
Date: | 1999-06-21 23:29:21 |
Message-ID: | 18337.930007761@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
Darren Greer <dgreer(at)websightsolutions(dot)com> writes:
> Now what I need to do is select all the users who have taken a test
> (for a particular station) within, say the last so many number of
> days. The following select statement does that.
> select distinct username, station
> from testmaster t1
> where 1 < (
> select count(t2.username)
> from testmaster t2
> where t2.test_date > '05-14-1999'
> and t2.station = 'WZZZ'
> and t1.username = t2.username
> )
> ;
The above doesn't seem to me to do what you claim you want to do ---
it seems to be looking for users who have taken the test *more than
once* in the given interval.
Assuming that the code is right and the comment wrong ;-), I agree
that this is the hard way to do it. The inner select will be
re-evaluated from scratch for every tuple scanned by the outer select,
so your run time is proportional to the square of the number of tuples
in testmaster. Not good. I think you want to use a HAVING clause:
SELECT username, station FROM testmaster
WHERE test_date > '05-14-1999' and station = 'WZZZ'
GROUP BY username, station
HAVING count(*) > 1;
The WHERE selects only the tuples you care about, the GROUP BY collects
them into groups with the same username & station (thus serving the
purpose you were using DISTINCT for; you don't need DISTINCT with GROUP
BY); and finally the HAVING selects only the groups you care about, ie
those containing more than one tuple. (When you use GROUP BY, count(*)
and other aggregates only aggregate over a group, not the whole table.)
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Hostmaster - Internet au Virtuel Inc. | 1999-06-22 00:12:36 | ODBC SQL question |
Previous Message | Darren Greer | 1999-06-21 20:45:38 | Trouble with massive select statement. |