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

Reply via email to