分组中的mysql限制

分组中的mysql限制,mysql,group-by,Mysql,Group By,假设我有这个表字段: Field1 Field2 Field3 a 1 1 a 1 2 a 1 3 a 1 4 a 2 1 a 2 2 a 2 3 a 3 1 b 1 1 b 1 2 b 1 3 b 2 1 c 1

假设我有这个表字段:

Field1  Field2 Field3
a       1      1
a       1      2
a       1      3
a       1      4
a       2      1
a       2      2
a       2      3
a       3      1
b       1      1
b       1      2
b       1      3
b       2      1
c       1      1
假设我需要按字段1分组,因为我需要对数据进行一些计算, 是否有方法仅检索按Field2 sorted desc分组的前2个元素

因此,对于这个例子,我想重温一下:

a,3,1
a,2,3
a,2,2
a,1,4
a,1,3
b,1,2
b,1,1
b,2,1
c,1,1
大概是

SELECT field1, 
       Sum(field2), 
       Sum(field3) 
FROM   table t1 
WHERE  t1.Field1 IN (SELECT t2.Field1 
                     FROM   table t2 
                     WHERE  t2.Field1 = t1.Field1 
                     ORDER  BY Field2, 
                               Field3 DESC 
                     LIMIT  2) 
GROUP  BY field1 

如果您使用的是MySQL 8+或更高版本,处理此问题的一个好方法是使用ROW_NUMBER:

如果您没有使用MySQL 8+,那么这个问题很快就会变得相当棘手。在MySQL 5.7或更早版本中,最好的方法是使用会话变量来模拟行数。但是,这需要一些详细的代码。您还可以尝试将每个组的前两个条目隔离开来,但这两个条目需要一些详细的代码。事实上,如果你需要长期运行这样的查询,那么考虑升级到MySQL 8 + ./P>前MySQL 8解决方案: 仅列出每个字段1、字段2组的最后两个值:

结果:

Field1  Field2  Field3
a       1       3
a       1       4
a       2       2
a       2       3
a       3       1
b       1       2
b       1       3
b       2       1
c       1       1
Field1  sum(Field2)     sum(Field3)
a       9               13
b       4               6
c       1               1
获取每个Field1组的总和:

结果:

Field1  Field2  Field3
a       1       3
a       1       4
a       2       2
a       2       3
a       3       1
b       1       2
b       1       3
b       2       1
c       1       1
Field1  sum(Field2)     sum(Field3)
a       9               13
b       4               6
c       1               1

注意:当Filed1、Filed2、Filed3的组合是唯一的时,这可以正常工作。如果Field3可以在Field1、Field2组中复制,我们需要更复杂的逻辑来将结果限制为每个组两行。

您使用的MySql版本是什么?版本5.7.18上的I am可能重复。您确定要使用Sumfield2吗?该值重复。@renemarxis然后检查注释上方的链接。或者升级到MySQL 8+并使用my answer.FWIW,我认为5.7查询与8.0查询的字符长度相同
Field1  sum(Field2)     sum(Field3)
a       9               13
b       4               6
c       1               1