MySQL将每一行分组为多个分组的一部分

时间:2019-12-17 12:48:26

标签: mysql average

我想请求对某些数据进行AVG。例如,如果我得到了

表1:

Col1 Col2
 1    1
 2    2
 3    3  

我想这样分组:

GRP Col1 Col2
 1    1    1
 12   2    2
 23   3    3

因此,第一行和第三行的中间行将被分组 而当您达到平均值时,您会得到:

Col1 Col2
1.5   1.5
2.5   2.5

在这一点上,我得到了类似的信息(我对其进行了一些更改,这样才有意义):

DROP PROCEDURE IF EXISTS getAverage;

DELIMITER //

CREATE PROCEDURE getAverage ()
BEGIN
    DECLARE current INT UNSIGNED DEFAULT 0;
    SET current := startDate - (step * (quantity - 1));
    SET endDate := endDate - (step * (quantity - 1));

    WHILE current < endDate DO
        SET @i := 0;
        SELECT
            FROM_UNIXTIME(MIN(date)),
            FORMAT(AVG(field_0), 2) AS field_0,
            FORMAT(AVG(field_1), 2) AS field_1
        FROM (
            SELECT
                table1.date,
                field_0,
                field_1
            FROM table1
        ) 
        AS Q1;

            SET current := current + step;
        END WHILE;

    END //

    DELIMITER ;

换句话说,我需要将记录从1到24,从2到25进行分组,依此类推。除了上面的过程之外,我不知道如何实现这一目标。

编辑: 我看到解释得不好。所以我在一个表中有N条记录。我想连续从1到M,然后从2到M + 1,从3到M + 2,...,从i到M + i。因此,每个记录与M-1个其他行组成一个组。 在带有GRP的示例中,我的意思是将存在诸如“ 1”,“ 2”,“ 3”之类的组。因此,如果我说按GRP分组,则第二行要多于1行。就像GRP对于M条记录将为'0'并使用那些行一样,但是它将对M条平均值使用每一行。如果这样的话。 上表的结果将如下所示:

1.5 1.5
2.5 2.5

当N = 3且M = 2时; 用于组织的年度参考。 (我不确定这是否是'term')。

我可以很容易地用PHP做到这一点,所以它会说“给我从K到L的平均值”,然后是K ++和L ++。其中K-L = M,但是我很确定SQL可以更快地完成它。

谢谢你的陪伴!

1 个答案:

答案 0 :(得分:0)

您的示例确实没有什么意义,所以这里有一些要考虑的地方...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,x INT NOT NULL
);

INSERT INTO my_table (x) VALUES(12),(24),(36);

SELECT * FROM my_table;
+----+----+
| id | x  |
+----+----+
|  1 | 12 |
|  2 | 24 |
|  3 | 36 |
+----+----+

SELECT 2*(CEILING(id/2)) n, AVG(x) average FROM my_table GROUP BY n;
+------+---------+
| n    | average |
+------+---------+
|    2 | 18.0000 |
|    4 | 36.0000 |
+------+---------+