【问题标题】:MySQL group each row to be part of multiple groupsMySQL 将每一行分组为多个组的一部分
【发布时间】:2019-12-17 12:48:26
【问题描述】:

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

表1:

Col1 Col2
 1    1
 2    2
 3    3  

我想这样分组:

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

所以中间行将被分组为第 1 行和第 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; 这用于组织的年度参考。 (我不确定这是否是“术语”)。

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

谢谢你们的时间!

【问题讨论】:

  • 我真的很难理解这里的逻辑。我怀疑 3 行数据集不能很好地代表问题
  • 我试图在编辑中更好地解释它。我仍然不认为它是完美的,但我想不出更好的方法来解释它。它是你有 N 条记录,你想要每个 M 的平均值,但是从 K 开始,到 L 结束,它不会将每次迭代增加 M,而是增加 1。再次感谢!

标签: mysql average


【解决方案1】:

你的例子真的没有什么意义,所以这里有一些需要考虑的事情......

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 |
+------+---------+

【讨论】:

  • 据我所知,这对每 M 条记录进行了平均。这不正是我正在寻找的。我已经更新了帖子,所以我希望它更有意义。谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2013-02-27
相关资源
最近更新 更多