2

让我尝试通过示例来解释我的意思:

我正在使用 PostgreSQL 版本 9.2.1

数据结构如下:

(timedate)date           | (float) data    |  ...
"2013-03-23 03:58:00-04" | 66819.59        |  ...
"2013-03-23 03:59:00-04" | 64277.22        |  ...
"2013-03-23 03:59:00-04" | 46841.75        |  ...
"2013-03-23 04:00:00-04" | 69697.38        |  ...
"2013-03-23 04:00:00-04" | 69452.69        |  ...
"2013-03-23 04:01:00-04" | 69697.47        |  ...

我的表有超过 500 万个数据点。我已经知道如何在开始和结束日期范围内获取数据。

这是我的问题:当范围太大时,假设它涵盖了整个数据,它将返回所有 500 万行,我想限制它返回的行而不省略任何数据。

例如,如果我想返回 5 行,我希望第一行是前一百万行数据的平均值。第二行是第二百万行数据的平均值,以此类推。(显然这个例子有点极端,我只是夸大了试图传达我需要做的事情)

感谢您的帮助和建议!

4

1 回答 1

1

如果你想要一天的平均值:

select
    date_trunc('day', "date")::date "day",
    avg("data") "data"
from t
group by 1
order by 1

'day'随心所欲地改变'month'或改变'week'

http://www.postgresql.org/docs/current/interactive/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

如果您真的想将数据按日期划分为 5 个块:

select
    floor(
        (row_number() over(order by "date"))::double precision
        * 5
        / (select count(*) from t)
    ) chunk,
    avg("data") "data"
from t
group by 1
order by 1
于 2013-04-17T19:21:00.987 回答