我有一个sql查询到mysql的问题,以获取每个组中的最后一条记录,并在一个查询中总结一些字段。我有一个表:
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
所以查询没有求和,只返回组中的最后一条记录 帮助)
答案 0 :(得分:0)
如果表格很大,那可能会有点慢,但它会得到想要的结果:
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
答案 1 :(得分:0)
我认为使用WITH ROLLUP for 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;
答案 2 :(得分:0)
你的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。