2017-03-01 79 views
0

我有一个非常简单的表,其中包含以下栏:MySQL的小组分组方式,结果

id | customer_id | total | created_at 

我当时正在此查询得到每天的结果在过去的十天

SELECT SUM(total) AS total, DATE_FORMAT(created_at, "%d/%m/%Y") AS date 
FROM table 
WHERE created_at BETWEEN "2017-02-20" AND "2017-03-01" 
GROUP BY created_at 
ORDER BY created_at DESC 

这工作得很好,但我只注意到有一个与被复制某种原因进口行的问题,所以我想更新查询,以便能够处理这种情况如果它再次发生,换句话说选择一排,而不是所有的日期和用户ID是相同的(总也ID entical)。

如果我将customer_id添加到该组似乎有效,但麻烦与那是查询返回每个客户每天的结果时,我只想要总数。

我已经尝试了几件事,但我还没有破解它,我认为这将是可以实现的使用子查询和/或内部连接,我已经尝试过目前为止,但数字是非常错误的:

SELECT 
    created_at, 
    (
     SELECT SUM(total) 
     FROM table test 
     WHERE test.created_at = table.created_at 
     AND test.customer_id = table.customer_id 
     GROUP BY customer_id, created_at 
     LIMIT 1 
    ) AS total 
FROM table 
WHERE created_at BETWEEN "2017-02-20" AND "2017-03-01" 
GROUP BY created_at 
ORDER BY created_at DESC 

这也是一个大表,所以找到一个高性能的方式来做到这一点也很重要。

回答

1

首先,你确定created_at是一个日期,而不是日期时间?这有很大的不同。

你可以做你想要使用聚合的两个层次的内容:

SELECT SUM(max_total) AS total, DATE_FORMAT(created_at, '%d/%m/%Y') AS date 
FROM (SELECT t.customer_id, t.created_at, MAX(total) as max_total 
     FROM table t 
     WHERE t.created_at BETWEEN '2017-02-20' AND '2017-03-01' 
     GROUP BY t.customer_id, t.created_at 
    ) t 
GROUP BY created_at 
ORDER BY created_at DESC; 
+0

嗨@Gordon Linoff,感谢您的回答,将尝试在第二,是的,这绝对是一个'DATE'列。 **更新**答作品完美,我刚在'GROUP BY created_at'添加到外部查询(在'ORDER BY'以上)作为原始答案返回一个结果。再次感谢! – martincarlin87