Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取SQL中每X行的平均值_Mysql_Sql - Fatal编程技术网

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!这里不鼓励只使用代码的答案,因为它们无法提供问题是如何解决的。请更新您的解决方案,并解释您的代码如何解决当前问题: