Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取每组的最后一条记录,并对其中一些记录求和_Mysql_Group By_Subquery_Sum - Fatal编程技术网

Mysql 获取每组的最后一条记录,并对其中一些记录求和

Mysql 获取每组的最后一条记录,并对其中一些记录求和,mysql,group-by,subquery,sum,Mysql,Group By,Subquery,Sum,我对mysql的sql查询有一个问题,即获取每个组中的最后一条记录,并在一次查询中对某些字段求和。我有一个表: name date interested made_call andrew.h 2011-02-04 10 10 andrew.h 2011-02-11 20 10 andrew.h 2011-02-13 2 10 sasha.g 2011-02-11 5

我对mysql的sql查询有一个问题,即获取每个组中的最后一条记录,并在一次查询中对某些字段求和。我有一个表:

name        date    interested  made_call
andrew.h    2011-02-04      10        10
andrew.h    2011-02-11      20        10
andrew.h    2011-02-13      2         10
sasha.g  2011-02-11      5         20
sasha.g  2011-02-12      5         1
我需要按名称对make_call列分组求和,并返回感兴趣的组的最后一条记录。 下面是我想要得到的结果:

name        date    interested  made_call
andrew.h    2011-02-13      2         30
sasha.g  2011-02-12      5         21
我试图通过此查询获得结果

SELECT a.name,a.date,a.interested,sum(made_call) as made_call
FROM `resultboard` a 
WHERE a.attendence = 1 
AND NOT EXISTS (select 1 from resultboard where name = a.name
       and id > a.id and attendence = 1)
GROUP BY name
但结果我得到了

  andrew.h  2011-02-13      2         10
  sasha.g    2011-02-12      5         1
所以查询没有求和,只返回组中的最后一条记录
帮助

如果表格很大,可能会有点慢,但会得到想要的结果:

SELECT a.name, t.date, a.interested, t.calls
FROM resultboard a 
JOIN (SELECT name, MAX(date) AS date, SUM(made_call) AS calls FROM resultboard 
     GROUP BY name) AS t
     ON a.name = t.name AND a.date = t.date

我认为使用WITH ROLLUP for GROUP BY修饰符可能会对您有所帮助

编辑;我搞错了,没必要用卷轴

SELECT r.name,  
       MAX(r.date) as date,  
       (SELECT r2.interested FROM resultboard r2 WHERE r2.name = r.name ORDER BY r.date DESC LIMIT 1),  
       SUM(made_call) as made_call  
FROM resultboard r 
GROUP BY name;

WHERE子句将除去最后一行以外的所有行作为总和的一部分

在其他一些数据库中,可以使用最后一个聚合函数。MySQL没有这样的功能,但您可以针对您的情况这样做:

SELECT
    a.name,
    SUBSTRING_INDEX(
      GROUP_CONCAT(CAST(a.date AS CHAR) ORDER BY date desc),
      ',', 1
    ) AS date,
    SUBSTRING_INDEX(
      GROUP_CONCAT(CAST(a.interested AS CHAR) ORDER BY date desc),
      ',', 1
    ) AS interested,
    sum(made_call) as made_call
FROM `resultboard` a 
WHERE a.attendence = 1 
GROUP BY name
在大数据集上它可能不会很快,但如果我的研究是正确的,它至少应该可以完成这项工作。我还没有测试过这个,所以YMMV