2017-03-01 55 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