Marc Sherman wrote:
> ......
>
> Heh. I obviously simplified my situation too much.
>
> This is closer to what I've really got:
>
> create table user (userid int4 primary key, groupid int4);
> create table log (userid int4, timestamp datetime, value int4);
>
> I need to select sum(value) for each group, where the values chosen
> are the newest log entry for each group member that is before a cutoff
> date (April 1, 2001).
>
> Here's what I'm currently using:
>
> select user.groupid, sum(l1.value)
> from log as l1, user
> where user.userid=log.userid
> and log.timestamp in (
> select max(timestamp) from log
> where log.timestamp<'2001-04-01'
> and log.userid=l1.userid)
> group by user.groupid;
>
> When I first posted, this was _very_ slow. I've since improved
> it by adding an index on log(userid,timestamp) - now it's just
> slow. If anyone knows how to make it faster, I'd appreciate it.
>
> - Marc
Try something like this:
SELECT
user.groupid, sum(l1.value)
FROM
log as l1, user
WHERE
user.userid = l1.userid and
l1.timestamp = (
SELECT
max(timestamp) from log
WHERE
log.timestamp < '2001-04-01' and
log.userid = l1.userid
)
GROUP by user.groupid;
1. you use in the same query both "log" and "l1" for the same table: "log as
l1";
2. you use log.timestamp in () ... but in this case you have ony one value ...
use "=" instead "in".
==================================================
George Moga,
Data Systems Srl
Slobozia, ROMANIA
P.S. Sorry for my english ...
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster