SQL / MySQL的SELECT和平均超过一定值
题
我有测量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)
我的问题是,在老集,Web服务的调用时间从[00-11]已经总结出来的。因此如上面列出的简单的语句将导致
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
解决方案
您将需要一个行集在它12行进行联接。
在最简单的解决方案会在联合来合成12个SELECT
语句:
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
其他提示
你可能最好使用临时表/视图这样做(我推荐了一个临时表的视图),或者你会最终有一个讨厌的情况下,具体的声明,这将是一场噩梦管理随着时间的推移。
不隶属于 StackOverflow