在 tb_user_online_log 表中,依據 create_time(Unix 時間戳)按小時區間統計不重複會員數(COUNT(DISTINCT user_id))。
SELECT
COUNT(DISTINCT user_id) AS user_count,
CASE
WHEN create_time > 1395046800 AND create_time < 1395050400 THEN '17:00-18:00'
WHEN create_time > 1395050400 AND create_time < 1395054000 THEN '18:00-19:00'
WHEN create_time > 1395054000 AND create_time < 1395057600 THEN '19:00-20:00'
WHEN create_time > 1395057600 AND create_time < 1395061200 THEN '20:00-21:00'
ELSE 'unknown'
END AS `date`
FROM tb_user_online_log
WHERE create_time > 1395046800 AND create_time < 1395061200
GROUP BY `date`
ORDER BY create_time;
缺點:硬編碼時間戳、區間固定、CASE WHEN 效率低、難以維護擴展。
SELECT
COUNT(DISTINCT user_id) AS user_count,
FROM_UNIXTIME(create_time, '%Y-%m-%d %H:00:00') AS hours,
CONCAT(FROM_UNIXTIME(create_time, '%Y-%m-%d %H:00'), '-', FROM_UNIXTIME(create_time, '%H') + 1, ':00') AS `date`
FROM tb_user_online_log
GROUP BY hours
ORDER BY create_time;
優點:
GROUP BY hours 可直接利用索引(若 create_time 有索引)。-- 按天分組
GROUP BY DATE(FROM_UNIXTIME(create_time))
-- 按月分組
GROUP BY DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m')
-- 按 15 分鐘分組
GROUP BY FROM_UNIXTIME(create_time, '%Y-%m-%d %H:%i:00')
create_time 建立索引。CASE WHEN 全表掃描且無法用索引。