MySQL仅从最新日期获取列的总和

MySQL仅从最新日期获取列的总和,mysql,Mysql,我有一张这样的桌子: --------------------------------------- | id | name | points | date | --------------------------------------- | 1 | ana | 1 | 2014-12-10 | | 2 | tom | 3 | 2015-12-09 | | 3 | jim | 1 | 2013-12-02 |

我有一张这样的桌子:

---------------------------------------
| id | name     | points |   date     |
---------------------------------------
| 1  | ana      | 1      | 2014-12-10 |
| 2  | tom      | 3      | 2015-12-09 |
| 3  | jim      | 1      | 2013-12-02 |
| 4  | ana      | 9      | 2014-12-10 |
| 5  | tom      | 3      | 2015-12-09 |
| 6  | jim      | 1      | 2016-12-08 |
| 7  | jim      | 5      | 2016-12-08 |
| 8  | ana      | 2      | 2016-12-08 |
| 9  | ana      | 1      | 2016-12-08 |
| 10 | tom      | 2      | 2013-12-07 |
-------------------------------------
在这个表中,我有一组名字。这些名称在同一日期可能有重复的条目,但有不同的点。它们也有不同日期的重复条目。日期都不一样,没有规律可循

我的目标是返回以下内容:

name, SUM(points) WHERE MAX(date) for the name group
所以我现在的问题基本上是:

SELECT name, SUM(points) FROM table GROUP BY name;
但是,我需要这样做,从名称组的最新日期开始,只计算名称组中的点条目,而不是将所有日期中的所有点相加


如何执行此操作?

要聚合每个名称的最新
日期
,可以对子查询进行联接,生成
MAX(date)
,同时联接外部表和子查询中的
名称
日期
。这允许您为该组设置
SUM()

SELECT
  t.name,
  SUM(points) AS total_points,
  max_date
FROM
  `table` t
  JOIN (
    -- Subquery produces latest date per name
    SELECT 
      name,
      MAX(date) AS max_date
    FROM `table`
    GROUP BY name
  ) name_dates
    -- Join table to subquery on both name and the aggregate date
    ON t.name = name_dates.name AND t.date = max_date
-- Group for the outer SUM()
GROUP BY t.name, max_date
这将产生以下结果:

+------+--------------+---------------------+
| name | total_points | max_date            |
+------+--------------+---------------------+
| ana  |            3 | 2016-12-08 00:00:00 |
| jim  |            6 | 2016-12-08 00:00:00 |
| tom  |            6 | 2015-12-09 00:00:00 |
+------+--------------+---------------------+
在这里,它正在发挥作用。 (sqlfiddle现在出现故障,可能需要将查询粘贴回以重新执行)

太棒了——我很惊讶没有更简单的方法来实现这一点,但这非常有效。谢谢其他RDBMS(SQL Server、Oracle、Postgresql)通过上的分区支持窗口功能,因此可以用较少的语法处理,但这通常是在MySQL中必须做到的。最终MySQL也将获得窗口函数——它们已经开发了一段时间。