SQL查询中的自定义组和平均值

时间:2017-09-26 13:38:20

标签: sql database postgresql

我对SQL查询有疑问,我可以使用Postgres执行以下操作:

1-如果我有数百万行,每行有两列"日期和价值"

2-我想对每1000行进行分组并返回"日期和avgValue(1000行)"

我的数据集示例:

Date | Value
2010 | 4
2011 | 2
2012 | 6
2013 | 8
2014 | 6
2015 | 4
2016 | 4
2017 | 3
2018 | 5
....

如果我想通过计算值列的平均值来对每三行进行分组,那么输出应该是这样的:

Date      | Value
2010-2012 |  (4+2+6)/3
2013-2015 |  (8+6+4)/3
2016-2018 |  (4+3+5)/3

全部谢谢

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望按日期分组,并在每个日期内,任意分组为1000行的批次,并计算该组中的平均值。

SELECT 
    date,
    rn,
    avg(value)
FROM
(
    SELECT 
        date,
        value,
        row_number() OVER(partition by date) / 1000 as rn
    FROM 
        schema.table
) a
GROUP BY date,rn

这里的关键是row_number()位,它创建一个按行递增的变量。我们使用OVER(按日期分区),这意味着计数器将为每个日期值重新开始。

然后我们将其除以1000,这样每个日期的1000行的每个块将具有rn的相同值。然后我们按日期分组。 ,以获得所需的输出。

此查询返回的是每个日期每1000行一行,其中包含该块的平均值。

答案 1 :(得分:1)

您可以按任何表达式进行分组,在您需要添加行号的情况下,然后使用除法基于行号计算组。请注意,您还需要订购日期列,否则会产生奇怪的结果。

http://sqlfiddle.com/#!15/9b773f/9/0