Mysql 获取SQL中每X行的平均值
假设我有下表Mysql 获取SQL中每X行的平均值,mysql,sql,Mysql,Sql,假设我有下表 +----+-------+ | 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行,如下所示
+----+-------+
| 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上工作。您可以使用modulos运算符对表的每n行进行操作。此示例将获得每10行的平均值:
select avg(Value) from some_table where id % 10 = 0;
然后可以对表中的行进行计数,对其应用某些因子,并将该值用作动态间隔:
select avg(Value) from some_table where id % (select round(count(*)/1000) from some_table) = 0;
当然,您需要根据表中的实际行数计算出最佳间隔
编辑:
重读你的文章,我意识到这是平均每N行,而不是每N行。我不确定这是否足够,或者你是否特别需要顺序平均值 根据您的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相同。将整数函数视为四分位数、五分位数、十分位数、百分位数。您可以使用它将数据平均分割为多个存储桶—在您的情况下,似乎需要五个存储桶 然后,您可以使用平均值来计算每个铲斗的平均值 NTILE在SQL-99中,所以大多数DBMS都应该有它。您可以试试
CREATE TABLE #YourTable
(
ID int
,[Value] float
)
INSERT #YourTable (ID, [Value]) VALUES
(1,2.0)
,(2,8.0)
,(3,3.0)
,(4,9.0)
,(5,1.0)
,(6,4.0)
,(7,2.5)
,(8,6.5)
SELECT
ID = MIN(ID) + '-' + MAX(ID)
,[Value] = AVG([Value])
FROM
(
SELECT
GRP = ((ROW_NUMBER() OVER(ORDER BY ID) -1) / 2) + 1
,ID = CONVERT(VARCHAR(10), ID)
,[Value]
FROM
#YourTable
) GrpTable
GROUP BY
GRP
DROP TABLE #YourTable
什么数据库oracle,MySQL,什么?MySQL。问题更新。我需要这些值来绘制一个小折线图,所以这些值需要是连续的。仅获取第n个值可以让我创建一些内容,但我担心会忽略一些值。如何在循环中使用它,我可以获取前10行的平均值,但之后它会重复相同的结果。它在sqlite3上工作得非常完美,但在mysql中没有按预期工作:。我忘了提到我需要它才能在mysql上运行。我成功地将最后一行从YourTable+4/5更改为FloorGrid-1/FloorSelectCount*。非常感谢。没有间隙的假设仅适用于“fake it”版本供参考:将有序分区中的行分配到指定数量的组中。分组编号,从一开始。对于每一行,NTILE返回该行所属组的编号。按ChunkStart添加顺序很重要,否则块将/可能会失去顺序对不起,但我需要它在MySQL上工作,MySQL不支持NTILE。欢迎来到这里,Francois Morin!这里不鼓励只使用代码的答案,因为它们无法提供问题是如何解决的。请更新您的解决方案,并解释您的代码如何解决当前问题: