我有一张这样的表:
---------------------------------------
| 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;
但是,我需要这个只计算名称组中从该名称组的最新日期开始的点条目,而不是对所有日期的所有点进行求和。
我该怎么做?
答案 0 :(得分:1)
要聚合每个名称的最新date
,您可以加入产生MAX(date)
的子查询,从外表加入name
和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 |
+------+--------------+---------------------+
这是在行动。 http://sqlfiddle.com/#!9/dece38/1 (sqlfiddle现在出现故障,可能需要重新粘贴查询以重新执行)