2013-03-22 44 views
7

Tôi đang cố gắng lấy số hàng từ bảng MySQL nơi dữ liệu được nhóm theo TUẦN.Trả lại tổng số hàng được nhóm theo tuần MySQL

Cho đến nay các truy vấn tôi có là:

"SELECT count(*) as tweets, twitTimeExtracted as date 
    FROM scene.twitData 
    group by week(twitTimeExtracted)" 

Truy vấn này trả về dữ liệu dưới đây:

enter image description here

Như bạn có thể thấy, những tuần là không đúng, tôi đang mong đợi dữ liệu cho mỗi tuần bắt đầu từ Thứ Hai ngày 7 tháng Giêng (7,14,21,28,4,11 vv ...) và chạy qua đến tuần này.

Tôi cũng đã thử một phiên bản sửa đổi của truy vấn orignal:

SELECT count(*) as tweets, twitTimeExtracted as date 
FROM scene.twitData 
WHERE date(twitTimeExtracted) 
    BETWEEN '2013-01-07' and '2013-03-11' 
group by week(twitTimeExtracted) 

này trả về kết quả tương tự như truy vấn đầu tiên.

Có thể có sự không nhất quán với một số dữ liệu được lưu trữ trong DATETIME: cột twitTimeExtracted trên một vài hàng dữ liệu? Tôi không thực sự biết tôi không có kinh nghiệm với MySQL.

Bất kỳ trợ giúp nào thực sự sẽ được đánh giá cao.

Cảm ơn

+1

Vì vậy, những gì số tuần là thứ hai 07 tháng 1? Số tuần nào là Thứ Hai ngày 1 tháng 1? Có thể thử: "nhóm theo tuần (twitTimeExtracted, 1)" – Strawberry

+0

_how_ điều này có đúng không? Bạn có mong đợi một ngày bắt đầu kỳ diệu của tuần xuất hiện không? (BTW, tôi sẽ nhóm trên 'YEAR()' quá ..) – Wrikken

Trả lời

14

này chuyển đổi datetime giá trị cho Thứ Hai thích hợp trong tuần

select count(*) as tweets, 
     str_to_date(concat(yearweek(twitTimeExtracted), ' monday'), '%X%V %W') as `date` 
from twitData 
group by yearweek(twitTimeExtracted) 

yearweek trả về cả tuần và năm. Cùng với chuỗi monday, str_to_date cung cấp cho bạn giá trị datetime của Thứ Hai.

Nếu tuần của bạn bắt đầu vào Monday, hãy sử dụng yearweek(twitTimeExtracted, 1) để thay thế.

+0

Điều này đã hiệu quả! cảm ơn tất cả mọi người đã giúp đỡ! – user1814487

+0

Không phải điều này không thành công khi có ngày từ các năm khác nhau? – NateS

+1

@NateS Tôi không nghĩ vậy. 'yearweek' phân phối cả năm * và * tuần, vì vậy nó sẽ hoạt động, ngay cả khi bạn có nhiều năm trong tập dữ liệu của mình. Vui lòng xem câu trả lời cập nhật. –

0

Một lựa chọn để luôn nhận được sự thứ hai trong tuần là sử dụng adddate:

SELECT count(*) as tweets, adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY) 
FROM twitData 
WHERE date(twitTimeExtracted) 
    BETWEEN '2013-01-07' and '2013-03-11' 
GROUP BY adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY) 

SQL Fiddle Demo

+0

cảm ơn, truy vấn này tạo ra ~ 19.000 hàng kết quả. các kết quả mỗi tuần không được ngưng tụ thành một kết quả đếm hàng. – user1814487

+0

@ user1814487 - không chắc chắn tại sao, bạn có thấy SQL Fiddle không? Không như mong đợi? – sgeddes

+0

SQL fiddle hoạt động như tôi mong đợi tuy nhiên khi tôi chạy truy vấn trên máy chủ của tôi, tôi nhận được tất cả các kết quả từ tuần được trả về với ngày tháng đầu tiên của tháng và thời gian và số 1 trong tổng số (*): ví dụ: http://i.imgur.com/kMMIAel.png – user1814487

0

thử điều này:

SELECT count(*) as tweets, 
    date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7 
FROM scene.twitData 
group by date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7 
+0

cảm ơn nhưng điều này làm nảy sinh lỗi: "Bạn có lỗi trong cú pháp SQL của bạn; hãy kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'ngày, ngày tháng (' 7 tháng 1 năm 2012 ', twitTimeExtracted)) Mod 7 FROM scene.twitData ' tại dòng 2 " – user1814487

0

Một giải pháp thay thế:

SELECT DATE(DATE_SUB(yourDate, INTERVAL WEEKDAY(yourDate) DAY)); 

Ví dụ:

SELECT DATE(DATE_SUB(DATE("2016-04-11"), INTERVAL WEEKDAY(DATE("2016-04-11")) DAY)); 
Các vấn đề liên quan