informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
-- 创建 user_activity 表
DROP TABLE IF EXISTS user_activity ;
CREATE TABLE user_activity (
user_id STRING,
activity_start TIMESTAMP,
activity_end TIMESTAMP
);
-- 插入数据
INSERT INTO user_activity VALUES
('user1', '2024-07-11 08:00:00', '2024-07-11 09:00:00'),
('user2', '2024-07-11 08:30:00', '2024-07-11 09:30:00'),
('user3', '2024-07-11 09:00:00', '2024-07-11 10:00:00'),
('user4', '2024-07-11 09:15:00', '2024-07-11 09:45:00'),
('user5', '2024-07-11 09:30:00', '2024-07-11 10:30:00'),
('user6', '2024-07-11 10:00:00', '2024-07-11 11:00:00'),
('user7', '2024-07-11 08:05:00', '2024-07-11 08:55:00'),
('user8', '2024-07-11 08:45:00', '2024-07-11 09:15:00'),
('user9', '2024-07-11 09:05:00', '2024-07-11 10:05:00'),
('user10', '2024-07-11 09:25:00', '2024-07-11 10:25:00'),
('user11', '2024-07-11 08:10:00', '2024-07-11 09:10:00'),
('user12', '2024-07-11 08:20:00', '2024-07-11 09:20:00'),
('user13', '2024-07-11 08:35:00', '2024-07-11 09:35:00'),
('user14', '2024-07-11 08:50:00', '2024-07-11 09:50:00'),
('user15', '2024-07-11 09:10:00', '2024-07-11 10:10:00'),
('user16', '2024-07-11 09:20:00', '2024-07-11 10:20:00'),
('user17', '2024-07-11 09:40:00', '2024-07-11 10:40:00'),
('user18', '2024-07-11 10:05:00', '2024-07-11 11:05:00'),
('user19', '2024-07-11 10:15:00', '2024-07-11 11:15:00'),
('user20', '2024-07-11 10:25:00', '2024-07-11 11:25:00');
Hitung jumlah puncak orang yang online pada setiap titik waktu untuk sistem tertentu.
Contoh hasil:
waktu_aktivitas | pengguna_maks |
---|---|
2024-07-11 08 | 8 |
2024-07-11 09 | 9 |
… | … |
Tekan hasil activity_time
Naik.
di dalam:
activity_time
Menunjukkan titik waktu statistik;max_users
Menunjukkan jumlah puncak orang tertinggi pada titik waktu tersebut.select
date_format(activity_time,'yyyy-MM-dd HH') activity_time,
max(total_users) max_users
from
(select
activity_time,
sum(flag) over(order by activity_time) total_users
from
(select
activity_start activity_time,
1 flag
from
user_activity
union all
select
activity_end activity_time,
-1 flag
from
user_activity)t1
)t2
group by
date_format(activity_time,'yyyy-MM-dd HH');
Outputnya adalah sebagai berikut:
Inti dari pertanyaan ini adalah subquery t2
Logikanya dalam:
select
activity_time,
sum(flag) over(order by activity_time) total_users
from
(select
activity_start activity_time,
1 flag
from
user_activity
union all
select
activity_end activity_time,
-1 flag
from
user_activity)t1;
Pertama, kita melakukan subkueri t1
Ubah kolom menjadi baris, jadi mengapa Anda perlu melakukan ini? Tentu saja hal ini demi kemudahan statistik.
Mari kita pikirkan. Ketika pengguna masuk dan memasuki sistem, apakah jumlah orang di sistem akan bertambah? +1
, sebaliknya, ketika pengguna keluar, apakah jumlah orangnya akan bertambah? -1
。
Ketika kita meletakkan waktu login dan logout di kolom yang sama, dan mengurutkannya berdasarkan waktu, dapatkah kita menghitung secara akurat jumlah orang yang online setiap saat? Ini adalah subquery. t2
Apa yang kami lakukan adalah melakukan penghitungan kumulatif melalui fungsi jendela,t2
Hasilnya terlihat seperti ini:
2024-07-11 08:00:00 1
2024-07-11 08:05:00 2
2024-07-11 08:10:00 3
2024-07-11 08:20:00 4
2024-07-11 08:30:00 5
2024-07-11 08:35:00 6
2024-07-11 08:45:00 7
2024-07-11 08:50:00 8
2024-07-11 08:55:00 7
2024-07-11 09:00:00 7
2024-07-11 09:00:00 7
2024-07-11 09:05:00 8
2024-07-11 09:10:00 8
2024-07-11 09:10:00 8
2024-07-11 09:15:00 8
2024-07-11 09:15:00 8
2024-07-11 09:20:00 8
2024-07-11 09:20:00 8
2024-07-11 09:25:00 9
2024-07-11 09:30:00 9
2024-07-11 09:30:00 9
2024-07-11 09:35:00 8
2024-07-11 09:40:00 9
2024-07-11 09:45:00 8
2024-07-11 09:50:00 7
2024-07-11 10:00:00 7
2024-07-11 10:00:00 7
2024-07-11 10:05:00 7
2024-07-11 10:05:00 7
2024-07-11 10:10:00 6
2024-07-11 10:15:00 7
2024-07-11 10:20:00 6
2024-07-11 10:25:00 6
2024-07-11 10:25:00 6
2024-07-11 10:30:00 5
2024-07-11 10:40:00 4
2024-07-11 11:00:00 3
2024-07-11 11:05:00 2
2024-07-11 11:15:00 1
2024-07-11 11:25:00 0
Terakhir, kelompokkan dan agregat berdasarkan titik waktu, hingga selesai max
Fungsi ini menemukan jumlah puncak maksimum orang pada setiap titik waktu dan selesai~