2009-10-08 45 views
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。

回答

3
select 
    distinct on (stat_id) 
    * 
FROM 
    stat_log 
WHERE 
    user_id = 1 
order by stat_id desc, registered_desc; 
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 

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

+0

它是有效的,但它返回与其他用户,这两个日期等 – 2009-10-08 16:42:37

+0

哎呀。莫名其妙地认为统计是主要关键。虽然“截然不同”(我不知道存在,直到我看到上述接受的答案!)编辑和修复查询似乎是一个更好的解决方案。 – iammichael 2009-10-08 17:25:50

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 
     )