Vui lòng xem đoạn mã sau, nếu câu trả lời của bạn cho nhận xét của tôi là yes
:) Vì dữ liệu của bạn tất cả vào năm 2012 và tháng 11, tôi đã mất ngày.
- SQLFIDDLE mẫu
Truy vấn:
select y.id, y.userid, y.score, y.datestamp
from (select id, userid, score, datestamp
from scores
group by day(datestamp)) as y
where (select count(*)
from (select id, userid, score, datestamp
from scores group by day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st
order by y.score desc
;
Kết quả:
ID USERID SCORE DATESTAMP
8 2 8.5 December, 07 2012 00:00:00+0000
20 3 6 December, 08 2012 00:00:00+0000
1 1 5 December, 06 2012 00:00:00+0000
Dựa trên các cập nhật sau này của bạn để câu hỏi. Nếu bạn cần một số cho mỗi người dùng theo năm / tháng / ngày và sau đó tìm thấy cao nhất, bạn có thể chỉ cần thêm chức năng tổng hợp như sum
cho truy vấn trên. Tôi đang tự đánh giá lại bản thân mình, vì dữ liệu mẫu của bạn chỉ dành cho một năm, không có nhóm điểm theo năm hoặc tháng. Đó là lý do tại sao tôi mất cả ngày.
select y.id, y.userid, y.score, y.datestamp
from (select id, userid, sum(score) as score,
datestamp
from scores
group by userid, day(datestamp)) as y
where (select count(*)
from (select id, userid, sum(score) as score
, datestamp
from scores
group by userid, day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st
order by y.score desc
;
Kết quả dựa trên tổng:
ID USERID SCORE DATESTAMP
1 1 47.5 December, 06 2012 00:00:00+0000
8 2 16 December, 07 2012 00:00:00+0000
20 3 6 December, 08 2012 00:00:00+0000
CẬP NHẬT MẪU DỮ LIỆU NGUỒN MỚI
Simon, hãy xem mẫu của riêng tôi. Vì dữ liệu của bạn đang thay đổi, tôi đã sử dụng của tôi. Đây là tài liệu tham khảo. Tôi đã sử dụng ansi
thuần túy kiểu không có over partition
hoặc dense_rank
Ngoài ra, hãy lưu ý dữ liệu tôi đã sử dụng nhận được điểm số top 2 chứ không phải top 3. Bạn có thể thay đổi cho phù hợp.
Đoán xem, câu trả lời đơn giản hơn 10 lần so với ấn tượng đầu tiên mà dữ liệu đầu tiên của bạn mang lại ....
SQLFIDDLE
Truy vấn đến 1:- cho tổng 2 người dùng hàng đầu theo người dùng mỗi ngày
SELECT userid, sum(Score), datestamp
FROM scores t1
where 2 >=
(SELECT count(*)
from scores t2
where t1.score <= t2.score
and t1.userid = t2.userid
and day(t1.datestamp) = day(t2.datestamp)
order by t2.score desc)
group by userid, datestamp
;
Kết quả cho truy vấn 1:
USERID SUM(SCORE) DATESTAMP
1 70 December, 06 2012 00:00:00+0000
1 30 December, 07 2012 00:00:00+0000
2 22 December, 06 2012 00:00:00+0000
2 25 December, 07 2012 00:00:00+0000
3 30 December, 06 2012 00:00:00+0000
3 30 December, 07 2012 00:00:00+0000
Truy vấn cuối cùng:- cho tất cả 2 ngày tổng cộng hàng đầu của người dùng
SELECT userid, sum(Score)
FROM scores t1
where 2 >=
(SELECT count(*)
from scores t2
where t1.score <= t2.score
and t1.userid = t2.userid
and day(t1.datestamp) = day(t2.datestamp)
order by t2.score desc)
group by userid
;
Kết quả cuối cùng:
USERID SUM(SCORE)
1 100
2 47
3 60
Dưới đây là ảnh chụp nhanh các phép tính trực tiếp của dữ liệu tôi đã sử dụng.