【问题标题】:Get last record in each group and SUM some of them获取每组中的最后一条记录并对其中一些进行求和
【发布时间】:2011-06-27 12:05:16
【问题描述】:

我对 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

我需要按名称汇总 made_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

所以查询没有求和,只返回组中的最后一条记录 帮助)

【问题讨论】:

    标签: mysql group-by subquery sum


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我认为将 WITH ROLLUP 用于 GROUP BY 修饰符可能会对您有所帮助。 http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

      编辑;我错了,不需要 WITH ROLLUP

      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;
      

      【讨论】:

        【解决方案3】:

        您的 WHERE 子句将排除除最后一行之外的所有行作为总和的一部分。

        在其他一些数据库中,您可以使用 LAST 聚合函数。 MySQL 没有,但您可以 emulate it 对您的情况像这样:

        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。

        【讨论】:

          猜你喜欢
          • 2017-12-15
          • 2017-08-26
          • 2022-01-19
          • 2011-09-06
          • 1970-01-01
          • 2023-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多