0

我必须使用一个分析工具来测量每小时对服务器的 Web 服务调用。这些测量值被插入到数据库中。以下是此类测量的片段:

mysql> SELECT * FROM sample s LIMIT 4;  
+---------+------+-------+  
| service | hour | calls |  
+---------+------+-------+  
| WS04    |   04 |    24 |  
| WS12    |   11 |    89 |  
| WSI64   |   03 |    35 |  
| WSX52   |   01 |    25 |  
+---------+------+-------+  
4 rows in set (0.00 sec)  

作为最终结果,我想知道每天每小时完成的所有 Web 服务的总和。显然,这可以通过 SUM() 和 GROUP BY 轻松完成:

mysql> SELECT hour, SUM(calls) FROM sample s GROUP BY hour;  
+------+------------+  
| hour | SUM(calls) |  
+------+------------+  
|   00 |        634 |  
|   01 |        642 |  
|   02 |        633 |  
|   03 |        624 |  
|   04 |        420 |  
|   05 |        479 |  
|   06 |        428 |  
|   07 |        424 |  
|   08 |        473 |  
|   09 |        434 |  
|   10 |        485 |  
|   11 |        567 |  
|   12 |        526 |  
|   13 |        513 |  
|   14 |        555 |  
|   15 |        679 |  
|   16 |        624 |  
|   17 |        796 |  
|   18 |        752 |  
|   19 |        843 |  
|   20 |        827 |  
|   21 |        774 |  
|   22 |        647 |  
|   23 |        533 |  
+------+------------+  
12 rows in set (0.00 sec)  

我的问题是,在旧集合中,已经汇总了 [00-11] 小时内的 Web 服务调用。因此,上面列出的简单语句将导致

mysql> SELECT hour, SUM(calls) FROM sample s GROUP BY hour;  
+------+------------+  
| hour | SUM(calls) |  
+------+------------+  
|   00 |       6243 | <------ sum of hours 00-11!  
|   12 |        526 |  
|   13 |        513 |  
|   14 |        555 |  
|   15 |        679 |  
|   16 |        624 |  
|   17 |        796 |  
|   18 |        752 |  
|   19 |        843 |  
|   20 |        827 |  
|   21 |        774 |  
|   22 |        647 |  
|   23 |        533 |  
+------+------------+  
13 rows in set (0.00 sec)

这是不希望的结果。为了使旧集 [00,12,...,23] 与新集 [00,01,...,23] 具有可比性,我希望有一个语句可以平均 [00] 的值并分配它在错过的时间,例如:

+------+------------+  
| hour | SUM(calls) |  
+------+------------+  
|   00 |    6243/11 |  
|   01 |    6243/11 |  
            [...]  
|   12 |        526 |  
            [...]  
|   23 |        533 |  
+------+------------+

我可以使用临时表或视图轻松地做到这一点,但没有它们我不知道如何做到这一点。

有任何想法吗?因为这让我发疯:P

4

2 回答 2

1

您可能最好使用临时表/视图来执行此操作(我建议在临时表上使用视图),否则您最终会得到一个令人讨厌的特定于案例的语句,随着时间的推移,这将是一场噩梦。

于 2009-03-17T11:24:58.623 回答
1

您需要一个包含 12 行的行集来进行连接。

最简单的解决方案是SELECT在一个联合中组合 12 条语句:

SELECT  COALESCE(morning.hour, sample.hour), 
        SUM(CASE WHEN morning.hour IS NULL THEN calls ELSE calls / 12 END) AS calls
FROM    sample
LEFT JOIN
        (
        SELECT 0 AS hour
        UNION ALL
        SELECT 1
        ...
        UNION ALL
        SELECT 11
        ) AS morning
ON      sample.hour = 0 AND sample.service IN ('old_service1', 'old_service2')
GROUP BY
        1
于 2009-03-17T11:35:17.460 回答