我有以下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.
怎么做?我尝试过限制和顶级,但没有成功
在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)
这将算都AVG和COUNT在一个索引扫描每个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)
| 归档时间: |
|
| 查看次数: |
1724 次 |
| 最近记录: |