используя агрегатную функцию с более чем двумя столбцами - PullRequest
0 голосов
/ 08 октября 2009

У меня есть две таблицы, статистика и 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 ]

3 голосов
/ 08 октября 2009
select
    distinct on (stat_id)
    *
FROM
    stat_log
WHERE
    user_id = 1
order by stat_id desc, registered_desc;
0 голосов
/ 08 октября 2009

Я сделал это с некоторыми нестандартными функциями в 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
        )
0 голосов
/ 08 октября 2009

Не уверен, что это допустимый SQL для PostgreSQL, но я думаю, что вы должны использовать что-то вроде этого:

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

Внутреннее объединение ограничивает результаты интересующими вас строками, которые возвращаются внутренним подзапросом.

...