表结构:
CREATE TABLE `t_log_online` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`online` int(10) unsigned NOT NULL COMMENT '在线人数量',
`distinct_ip` int(11) NOT NULL DEFAULT '0' COMMENT '在线IP数量',
`dateline` int(11) NOT NULL COMMENT '写入时间戳',
PRIMARY KEY (`id`),
KEY `dateline` (`dateline`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=425740 DEFAULT CHARSET=utf8mb4 COMMENT='玩家在线日志表';
SQL语句:
获取每日峰值的所有数据列
SELECT
a1.*
FROM
t_log_online a1,
(
SELECT
max(`online`) `online`,
dateline
FROM
t_log_online
WHERE
`online` > 0
and dateline >= 1606752000 and dateline <= 1611381706
GROUP BY
FROM_UNIXTIME(dateline, '%Y-%m-%d')
) a2
WHERE
a1.`online` = a2.`online`
and a1.`online` > 0
AND FROM_UNIXTIME(a1.dateline, '%Y-%m-%d') = FROM_UNIXTIME(a2.dateline, '%Y-%m-%d')
AND a1.dateline >= 1606752000 and a1.dateline <= 1611381706
ORDER BY
dateline desc
获取每日峰值的最后一条数据
SELECT
id,
`online`,
dateline,
distinct_ip
FROM
(
/** 获取每日峰值数据 **/
SELECT
a1.*
FROM
t_log_online a1,
(
SELECT
max(`online`) `online`,
dateline
FROM
t_log_online
WHERE
`online` > 0
and dateline >= 1606752000 and dateline <= 1611381706
GROUP BY
FROM_UNIXTIME(dateline, '%Y-%m-%d')
) a2
WHERE
a1.`online` = a2.`online`
AND a1.`online` > 0
/** 关键逻辑 **/
AND FROM_UNIXTIME(a1.dateline, '%Y-%m-%d') = FROM_UNIXTIME(a2.dateline, '%Y-%m-%d')
/** 排序,这里决定了最后获取的数据是 每日峰值的第一条还是最后一条 **/
ORDER BY
dateline DESC
) a
/** 按日分组获取 并获取组内 第一条数据 **/
GROUP BY
FROM_UNIXTIME(dateline, '%Y-%m-%d')