0

stats と stat_log の 2 つのテーブルがあります。統計ログは次のようになります。

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 に答える