我想请求对某些数据进行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可以更快地完成它。
谢谢你的陪伴!
答案 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 |
+------+---------+