【发布时间】: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。再次感谢!