我对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
全部谢谢
答案 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)
您可以按任何表达式进行分组,在您需要添加行号的情况下,然后使用除法基于行号计算组。请注意,您还需要订购日期列,否则会产生奇怪的结果。