Silakan lihat kode berikut, jika jawaban Anda untuk komentar saya adalah yes
:) Karena data Anda semua tahun 2012, dan bulan november, saya ambil hari.
- SQLFIDDLE contoh
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.