MySQL从最近的日期开始获取列的SUM

时间:2017-03-31 02:10:42

标签: mysql

我有一张这样的表:

---------------------------------------
| 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;

但是,我需要这个只计算名称组中从该名称组的最新日期开始的点条目,而不是对所有日期的所有点进行求和。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

要聚合每个名称的最新date,您可以加入产生MAX(date)的子查询,从外表加入namedate子查询。这允许您为该组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 |
+------+--------------+---------------------+

这是在行动。 http://sqlfiddle.com/#!9/dece38/1 (sqlfiddle现在出现故障,可能需要重新粘贴查询以重新执行)