Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chọn 3 điểm cao nhất mỗi ngày cho mỗi người dùng

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.

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Tạo một bảng quan hệ với 2 auto_increment khác nhau

  2. Làm thế nào để kiểm tra xem một hàng có tồn tại trong MySQL hay không? (tức là kiểm tra xem email có tồn tại trong MySQL hay không)

  3. Làm thế nào để Kết nối R với MySQL hoặc làm thế nào để cài đặt gói RMySQL?

  4. Quyền truy cập MYSQL bị từ chối đối với người dùng 'root' @ 'localhost'

  5. Làm thế nào để tìm bảng lớn nhất trong cơ sở dữ liệu MySQL?