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

waktu paling aktif dalam sehari berdasarkan waktu mulai dan berakhir

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 , offline 2013-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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pengaturan nilai bendera berdasarkan catatan ada di tabel lain

  2. Buat koneksi gabungan ke MySQL di android

  3. Membuat carriage return di sel csv melalui php

  4. Butuh bantuan untuk mengakses database mysql menggunakan node.js

  5. Cara membaca data tabel dari Mysql ke Pig