我有一个基于DHCPD日志构建的单表SQL数据库,结构如下:
+------+-------+------+----------+---------+-------------------+-----------------+
| id | Month | Day | Time | Type | MAC | ClientIP |
+------+-------+------+----------+---------+-------------------+-----------------+
| 9305 | Nov | 24 | 03:20:00 | DHCPACK | 00:04:f2:4b:dd:51 | 10.123.246.116 |
| 9307 | Nov | 24 | 03:20:07 | DHCPACK | 00:04:f2:99:4c:ba | 10.123.154.176 |
| 9310 | Nov | 24 | 03:20:08 | DHCPACK | 00:19:bb:cf:cd:28 | 10.99.107.3 |
| 9311 | Nov | 24 | 03:20:08 | DHCPACK | 00:19:bb:cf:cd:28 | 10.99.107.3 |
日志中的每个DHCP事件最终都将进入此数据库,因此任何时间点的事件都可能用于构建图形。为了利用数据进行绘图,我需要能够创建一个包含多个列的输出表,但其值来自与特定模式匹配的单个列中的数量。
我设法提出的最接近的是这个查询:
select 'Data' as ClientIP, count(*) from Log where ClientIP like '10.99%' and MAC like '00:04:f2%'
union
select 'Voice' as ClientIP, count(*) from Log where ClientIP like '10.123%' and MAC like '00:04:f2%';
产生以下结果:
+-----------+-------+
| ClientIP | Count |
+-----------+-------+
| Data | 4618 |
| Voice | 13876 |
+-----------+-------+
一次性查询很好,但我想把这两行,把它们变成两列,并运行相同的查询,每小时一行(例如)。我想要这样的东西:
+------+-------+------+
| Hour | Voice | Data |
+------+-------+------+
| 03 | 22 | 4 |
| 04 | 123 | 23 |
| 05 | 45 | 5 |
非常欢迎任何建议。
由于
答案 0 :(得分:0)
为(根据需要)创建一个单独的表:
+ ------ + ------- + ------ + |小时|声音|数据| + ------ + ------- + ------ +
并使用触发器每小时更新一次。
答案 1 :(得分:0)
您可以按小时分组并使用条件计算来计算数据和语音流量。 例如:
SELECT
HOUR(time) AS `Hour`,
SUM(CASE WHEN ClientIP like '10.99%' and MAC like '00:04:f2%' THEN 1 ELSE 0 END) AS `Data`,
SUM(CASE WHEN ClientIP like '10.123%' and MAC like '00:04:f2%' THEN 1 ELSE 0 END) AS `Voice`
FROM log
GROUP BY HOUR(time)