假设我有下表
+----+-------+
| 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 中一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)