Jika saya memahami persyaratan Anda dengan benar, jika grafik ini mewakili aktivitas pengguna:
Day
12/1 12/2 12/3 12/4 ...
Hour 0 xx x x xx
1 x xx xx
2 xxx x x xx
3 x x
4 x x
5 x x
6 x
...
Anda ingin tahu bahwa 02:00 adalah waktu dalam sehari dengan aktivitas rata-rata tertinggi (baris dengan 7 x
), dan 12/4 adalah hari paling aktif (kolom dengan 10 x
). Perhatikan bahwa ini tidak berarti bahwa 02:00 dari 12/4 adalah jam paling aktif yang pernah ada, seperti yang Anda lihat dalam contoh. Jika ini bukan yang Anda inginkan, mohon klarifikasi dengan contoh nyata masukan dan hasil yang diinginkan.
Kami membuat beberapa asumsi:
- Catatan aktivitas dapat dimulai pada satu tanggal dan selesai pada tanggal berikutnya. Misalnya:online
2013-12-02 23:35
, offline2013-12-03 00:13
. - Tidak ada catatan aktivitas yang memiliki durasi lebih dari 23 jam, atau jumlah catatan tersebut dapat diabaikan.
Dan kita perlu mendefinisikan apa yang dimaksud dengan 'aktivitas'. Saya memilih kriteria yang lebih mudah dihitung dalam setiap kasus. Keduanya dapat dibuat lebih akurat jika diperlukan, dengan biaya kueri yang lebih kompleks.
- Waktu paling aktif dalam sehari adalah jam di mana lebih banyak catatan aktivitas tumpang tindih. Perhatikan bahwa jika pengguna memulai dan berhenti lebih dari sekali selama satu jam, itu akan dihitung lebih dari sekali.
- Hari yang paling aktif akan menjadi hari di mana ada lebih banyak pengguna unik yang aktif setiap saat sepanjang hari.
Untuk waktu paling aktif dalam sehari, kita akan menggunakan meja bantu kecil yang menampung 24 jam yang mungkin. Itu juga dapat dibuat dan digabungkan dengan cepat dengan teknik yang dijelaskan dalam jawaban lain.
CREATE TABLE hour ( hour tinyint not null, primary key(hour) );
INSERT hour (hour)
VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
, (11), (12), (13), (14), (15), (16), (17), (18), (19), (20)
, (21), (22), (23);
Kemudian kueri berikut memberikan hasil yang diperlukan:
SELECT hour, count(*) AS activity
FROM steamonlineactivity, hour
WHERE ( hour BETWEEN hour(online) AND hour(offline)
OR hour(online) BETWEEN hour(offline) AND hour
OR hour(offline) BETWEEN hour AND hour(online) )
GROUP BY hour
ORDER BY activity DESC;
SELECT date, count(DISTINCT userID) AS activity
FROM (
SELECT userID, date(online) AS date
FROM steamonlineactivity
UNION
SELECT userID, date(offline) AS date
FROM steamonlineactivity
) AS x
GROUP BY date
ORDER BY activity DESC;