0

我有两个表,stats 和 stat_log。统计日志是这样的:

user_id,stat_id,value,registered

它记录给定时间的统计值。我需要给定用户的每个统计数据的最后一个值。

所以我想要这样的东西,但有价值观: select stat,max(registered) from stat_log where uid = 1 group by stat;

 stat |    max       
------+------------  
    6 | 2009-10-08  
    1 | 2009-10-08  
    3 | 2009-10-08  
    5 | 2009-10-08  
    7 | 2009-10-08  
    4 | 2009-10-08  

相反,我有这个:

select stat,max(registered),value from stat_log where uid = 1 group by stat,value;

 stat |    max     | value   
------+------------+-------  
    4 | 2009-10-08 | 38  
    5 | 2009-10-08 | 118  
    1 | 2009-10-08 | 100  
    1 | 2009-10-07 | 101  
    6 | 2009-10-08 | 68  
    3 | 2009-10-08 | 110    
    7 | 2009-10-08 | 53

什么是正确的查询?这是 PostgreSQL 8.3。

4

3 回答 3

3
select
    distinct on (stat_id)
    *
FROM
    stat_log
WHERE
    user_id = 1
order by stat_id desc, registered_desc;
于 2009-10-08T16:33:53.210 回答
0

不确定这是否是适用于 PostgreSQL 的有效 SQL,但我认为您应该能够使用以下内容:

select * from stat_log
inner join (
    select uid,stat,max(registered) as registered from stat_log group by uid,stat
) as maxrecords on stat_log.stat = maxrecords.stat and
                   stat_log.uid = maxrecords.uid and
                   stat_log.registered = maxrecords.registered
where stat_log.uid = 1

“内部连接”将结果限制为您感兴趣的由内部子查询返回的行。

于 2009-10-08T16:18:09.450 回答
0

我已经使用 Oracle 中的一些非标准功能完成了此操作,但否则需要子查询或连接。我喜欢这种形式,因为它对我来说是合乎逻辑的,但理想情况下,数据库会以与加入版本相同的方式执行它。

select stat, registered, value
from stat_log a
where
    id = 1
    and registered = (
        select max(registered)
        from stat_log
        where
            b.id = a.id
            and b.stat = a.stat
        )
于 2009-10-08T16:34:57.030 回答