通过排序在mySQL数据库中进行分组和计算

时间:2017-06-29 03:30:19

标签: mysql database

我的下表包含n行数据(此处为n = 14):

id  |  a    |  b    |  c    |  d    |  e      -----> fields (id is the primary key)
+---+-------+-------+-------+-------+------
0   |  a0   |  b0   |  c0   |  d0   |  e0
1   |  a1   |  b1   |  c1   |  d1   |  e1
2   |  a2   |  b2   |  c2   |  d2   |  e2
3   |  a3   |  b3   |  c3   |  d3   |  e3
+---+-------+-------+-------+-------+------
4   |  a4   |  b4   |  c4   |  d4   |  e4
5   |  a5   |  b5   |  c5   |  d5   |  e5
6   |  a6   |  b6   |  c6   |  d6   |  e6
7   |  a7   |  b7   |  c7   |  d7   |  e7
+---+-------+-------+-------+-------+------
8   |  a8   |  b8   |  c8   |  d8   |  e8
9   |  a9   |  b9   |  c9   |  d9   |  e9
10  |  a10  |  b10  |  c10  |  d10  |  e10
11  |  a11  |  b11  |  c11  |  d11  |  e11
+---+-------+-------+-------+-------+------
12  |  a12  |  b12  |  c12  |  d12  |  e12
13  |  a13  |  b13  |  c13  |  d13  |  e13
+---+-------+-------+-------+-------+------   

现在考虑m = 4(m也可以有其他+ ve整数值) 我按照m的升序将数据分组到id行,并按如下方式获取其余行:

id  |  a    |  b    |  c    |  d    |  e
+---+-------+-------+-------+-------+------
0   |  a0   |  b0   |  c0   |  d0   |  e0
1   |  a1   |  b1   |  c1   |  d1   |  e1
2   |  a2   |  b2   |  c2   |  d2   |  e2
3   |  a3   |  b3   |  c3   |  d3   |  e3
+---+-------+-------+-------+-------+------
4   |  a4   |  b4   |  c4   |  d4   |  e4
5   |  a5   |  b5   |  c5   |  d5   |  e5
6   |  a6   |  b6   |  c6   |  d6   |  e6
7   |  a7   |  b7   |  c7   |  d7   |  e7
+---+-------+-------+-------+-------+------
8   |  a8   |  b8   |  c8   |  d8   |  e8
9   |  a9   |  b9   |  c9   |  d9   |  e9
10  |  a10  |  b10  |  c10  |  d10  |  e10
11  |  a11  |  b11  |  c11  |  d11  |  e11
+---+-------+-------+-------+-------+------
12  |  a12  |  b12  |  c12  |  d12  |  e12
13  |  a13  |  b13  |  c13  |  d13  |  e13
+---+-------+-------+-------+-------+------  

然后我想要一个查询来获取以下数据:

idd  |  aa   |  bb             |  cc               |  dd   |  ee
+----+-------+-----------------+-------------------+-------+--------------+
0    |  a0   |  max(b0,..,b3)  |  min(c0,...,c3)   |  d3   |  (e0+...+e3)
1    |  a4   |  max(b4,..,b7)  |  min(c4,...,c7)   |  d7   |  (e4+...+e7)
2    |  a8   |  max(b8,..,b11) |  min(c8,...,c11)  |  d11  |  (e8+...+e11)
3    |  a12  |  max(b12,b13)   |  min(c12,c13)     |  d13  |  (e12+e13)
+----+-------+-----------------+-------------------+-------+--------------+  

我是mySQL数据库(Ubuntu)的新手,并尝试和Goggling多天寻求解决方案。
如果有人向我展示mySQL查询如何实现它将是非常有帮助的。

对于m = 5,查询应返回以下数据:

idd  |  aa   |  bb             |  cc               |  dd   |  ee
+----+-------+-----------------+-------------------+-------+--------------+
0    |  a0   |  max(b0,...,b4) |  min(c0,...,c4)   |  d4   |  (e0+...+e4)
1    |  a5   |  max(b5,...,b9) |  min(c5,...,c9)   |  d9   |  (e5+...+e9)
2    |  a10  |  max(b10,..,b13)|  min(c10,..,c13)  |  d13  |  (e10...+e13)
+----+-------+-----------------+-------------------+-------+--------------+ 

提前致谢。 。

1 个答案:

答案 0 :(得分:1)

由于您已经有一个id列,其行为类似于行号,因此要将4个记录批量分组,您可以在id上除以4进行聚合,将其截断为整数。要查看这将如何工作,{0}到0和包含3的id值将具有0的组,因为将这些值除以4会产生小于1.同样,接下来的四个记录id值从4到7,将有一组1。

SELECT
    TRUNCATE(t1.id / 4, 0) AS idd,
    MAX(CASE WHEN t1.id = (SELECT MIN(t2.id) FROM yourTable t2
                           WHERE TRUNCATE(t2.id / 4, 0) = TRUNCATE(t1.id / 4, 0))
             THEN t1.a END) AS aa,
    MAX(t1.b) AS bb,
    MIN(t1.c) AS cc,
    MAX(CASE WHEN t1.id = (SELECT MAX(t2.id) FROM yourTable t2
                           WHERE TRUNCATE(t2.id / 4, 0) = TRUNCATE(t1.id / 4, 0))
             THEN t1.d END) AS dd,
    SUM(t1.e) AS ee
FROM yourTable t1
GROUP BY
    TRUNCATE(t1.id / 4, 0);

<强>输出:

enter image description here

在这里演示:

Rextester