Truy vấn của bạn không mang tính xác định nên không có gì ngạc nhiên khi bạn nhận được kết quả không mong muốn. Ý tôi là bạn có thể chạy truy vấn này trên cùng một dữ liệu 5 lần và nhận được 5 tập kết quả khác nhau. Điều này là do bạn đang chọn DATE(timestamp)
nhưng nhóm theo WEEK(DATE(startdate))
, do đó, truy vấn sẽ trả về thời gian của hàng đầu tiên mà nó xuất hiện trong mỗi tuần ngày bắt đầu trong BẤT KỲ đặt hàng.
Hãy xem xét 2 hàng sau (có dấu thời gian ở định dạng ngày tháng để dễ đọc):
TimeStamp StartDate
20120601 20120601
20120701 20120601
Truy vấn của bạn đang nhóm theo WEEK(StartDate)
là 23, vì cả hai hàng đều đánh giá cùng một giá trị nên bạn sẽ mong đợi kết quả của mình có 1 hàng có tổng số là 2.
TUY NHIÊN DATE(Timestamp)
Cũng nằm trong danh sách được chọn và vì không có ORDER BY
câu lệnh truy vấn không biết Dấu thời gian nào để trả về '20120601' hoặc '20120701'. Vì vậy, ngay cả trên tập hợp kết quả nhỏ này, bạn có 50:50 cơ hội nhận được:
TimeStamp COUNT
20120601 2
và cơ hội 50:50 để nhận được
TimeStamp COUNT
20120701 2
Nếu bạn thêm nhiều dữ liệu vào tập dữ liệu như vậy:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Bạn có thể nhận được
TimeStamp COUNT
20120601 2
20120701 1
hoặc
TimeStamp COUNT
20120701 2
20120701 1
Bạn có thể thấy với 37.000.000 hàng, bạn sẽ sớm nhận được kết quả mà bạn không mong đợi và không thể đoán trước!
CHỈNH SỬA
Vì có vẻ như bạn đang cố gắng lấy ngày đầu tuần trong kết quả của mình, trong khi nhóm theo tuần, bạn có thể sử dụng thông tin sau để bắt đầu tuần (thay thế CURRENT_TIMESTAMP bằng bất kỳ cột nào bạn muốn):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Sau đó, bạn cũng có thể nhóm theo ngày này để nhận được kết quả hàng tuần và tránh gặp rắc rối khi có những thứ trong danh sách đã chọn mà không có trong nhóm của bạn trước.