PostgreSQL:选择N导致逐个查询

Gac*_*cek 2 sql postgresql

我有以下SQL查询从我的表中选择一些结果:

select  avg(c3), count(c3), std  
from ssims where obraz = 'lena' group by std order by std
Run Code Online (Sandbox Code Playgroud)

但是我为std的不同值执行了不同数量的测试,所以它返回给我类似的东西:

0.906176136363636;44;5
0.881669302325582;43;10
0.855873409090909;44;15
0.829195813953488;43;20
0.802071590909091;44;25
0.774523720930233;43;30
0.747213636363636;44;35
0.720115581395349;43;40
0.694712954545455;44;45
0.668683255813953;43;50
Run Code Online (Sandbox Code Playgroud)

我想要做的是为每个std值选择常数(即20)个结果的平均值.因此,在这样的查询之后,第二列对于每一行将是20.

怎么做?我尝试过限制和顶级,但没有成功

Qua*_*noi 6

PostgreSQL 8.3:

SELECT  a[1] AS avg_std, a[2] AS cnt_std, std
FROM    (
        SELECT  (
                SELECT  ARRAY[AVG(c3) , COUNT(*)]
                FROM    (
                        SELECT  c3
                        FROM    ssims si
                        WHERE   obraz = 'lena'
                                AND si.std = so.std
                        ORDER BY
                                id
                        LIMIT 20
                        ) q
                ) a
        FROM    (
                SELECT  DISTINCT std
                FROM    ssims
                WHERE   obraz = 'lena'
                ) so
        ) q
Run Code Online (Sandbox Code Playgroud)

这将算都AVGCOUNT在一个索引扫描每个STD.

(obraz, std, id)为此创建复合索引以快速工作.

PostgreSQL 8.4:

SELECT  AVG(c3), COUNT(*), std
FROM    (
        SELECT  std, c3, ROW_NUMBER() OVER (PARTITION BY std ORDER BY id) AS rn
        FROM    ssims
        WHERE   obraz = 'lena'
        ) q
WHERE   rn <= 20
GROUP BY
        std
Run Code Online (Sandbox Code Playgroud)