假设我有下表
+----+-------+ | Id | Value | +----+-------+ | 1 | 2.0 | | 2 | 8.0 | | 3 | 3.0 | | 4 | 9.0 | | 5 | 1.0 | | 6 | 4.0 | | 7 | 2.5 | | 8 | 6.5 | +----+-------+
我想绘制这些值,但是由于我的真实表有成千上万个值,因此我考虑了获取每X行的平均值。我有什么办法可以做到这一点,即每2或4行,如下所示:
2 +-----+------+ | 1-2 | 5.0 | | 3-4 | 6.0 | | 5-6 | 2.5 | | 7-8 | 4.5 | +-----+------+ 4 +-----+------+ | 1-4 | 5.5 | | 5-8 | 3.5 | +-----+------+
另外,是否有任何方法可以根据表中的总行数使此X值动态化?例如,如果我有1000行,则将基于每200行(1000/5)计算平均值,但是如果我有20行,则应基于每4行(20/5)计算平均值。
我知道如何以编程方式执行此操作,但是有什么方法可以使用纯SQL来执行此操作?
编辑:我需要它在mysql上工作。
根据您的DBMS,类似这样的方法将起作用:
SELECT ChunkStart = Min(Id), ChunkEnd = Max(Id), Value = Avg(Value) FROM ( SELECT Chunk = NTILE(5) OVER (ORDER BY Id), * FROM YourTable ) AS T GROUP BY Chunk ORDER BY ChunkStart;
无论您有多少行,这都会创建5个组或块。
如果您没有开窗功能,则可以伪造它:
SELECT ChunkStart = Min(Id), ChunkEnd = Max(Id), Value = Avg(Value) FROM YourTable GROUP BY (Id - 1) / (((SELECT Count(*) FROM YourTable) + 4) / 5) ;
我在这里做了一些假设,例如Id从1开始并且没有间隔,并且如果事情没有平均分配,那么您将希望最后一组太小而不是太大。我还假设整数除法将导致在MS SQL Server中。
Id