Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pilih 3 skor tertinggi setiap hari untuk setiap pengguna

Silakan lihat kode berikut, jika jawaban Anda untuk komentar saya adalah yes :) Karena data Anda semua tahun 2012, dan bulan november, saya ambil hari.

Pertanyaan:

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
;

Hasil:

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

Berdasarkan pembaruan terakhir Anda untuk pertanyaan. Jika Anda memerlukan beberapa per pengguna berdasarkan tahun/bulan/hari dan kemudian menemukan yang tertinggi, Anda cukup menambahkan fungsi agregasi seperti sum ke pertanyaan di atas. Saya mengulangi diri saya sendiri, karena data sampel Anda hanya untuk satu tahun, tidak ada kelompok poin berdasarkan tahun atau bulan. Itu sebabnya saya mengambil hari.

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
;

Hasil berdasarkan jumlah:

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

DIPERBARUI DENGAN SAMPEL DATA SUMBER BARU

Simon, tolong lihat sampel saya sendiri. Karena data Anda berubah, saya menggunakan milik saya. Ini referensinya. Saya telah menggunakan ansi pure murni gaya tanpa over partition atau dense_rank .Juga perhatikan data yang saya gunakan mendapatkan skor 2 teratas bukan 3 teratas. Anda dapat mengubahnya.

Coba tebak, jawabannya 10 kali lebih sederhana daripada kesan pertama yang diberikan data pertama Anda....

SQLFIDDLE

Kueri ke 1:-- untuk 2 jumlah teratas menurut pengguna setiap hari

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 
;

Hasil untuk kueri 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

Kueri Terakhir:-- untuk semua 2 hari teratas 2 jumlah oleh pengguna

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
;

Hasil Akhir:

USERID  SUM(SCORE)
1      100
2      47
3      60

Ini dia snapshot dari perhitungan langsung data yang saya gunakan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat kenaikan otomatis mengisi nomor yang sebelumnya dihapus

  2. pelengkapan otomatis menunjukkan semua entri, Tidak melakukan pencarian apa pun

  3. Temukan peringkat bilangan bulat di mysql

  4. Bagaimana Fungsi OCT() Bekerja di MySQL

  5. Cara menghapus baris duplikat dan memperbarui tabel