2009-03-17 4 views
0

시간당 서버에 대한 웹 서비스 호출을 측정하는 분석 도구로 작업해야합니다. 이러한 측정은 데이터베이스에 삽입됩니다.SQL/MySQL 특정 값 이상의 SELECT 및 평균

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) 

나는 하루 중 시간에 따라 모든 웹 서비스 완료의 합을 알고 싶습니다 최종 결과 : 다음은 이러한 측정의 조각입니다. 분명히, 이것은 쉽게 의해 SUM()와 그룹으로 수행 할 수 있습니다

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]에서 시간에 호출하는 것입니다. 따라서 위의 간단한 문은

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

+0

이 아마도 당신이 12로 나누어보다는으로 나누어 12시간 00..11을 통해 6243 전화를 배포해야 11. –

답변

1

조인을 만들려면 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 
+0

일부 데이터는 시간 0, 1, ... 11에 대한 실제 값을 가지므로 누락 된 시간에 대한 데이터가없는 경우 배포를 수행해야합니다. –

+0

이 문제를 처리하도록 업데이트되었습니다. – Quassnoi

1

아마도 임시 테이블/뷰 (임시 테이블을 통한 뷰를 권하고 싶다)를 사용하는 것이 가장 좋을 것이다. 그렇지 않으면 불쾌한 사례와 관련된 특정 문장으로 끝날 것이다. 시간이 지남에 따라 관리 할 수있는 악몽입니다.

+0

임시 테이블을 통해 실제로 뷰를 만들 수 있습니까? 임시 테이블이 가장 깨끗한 방법이라고 동의합니다. –

+0

임시 테이블 대신 뷰가 있음을 의미합니다 ... 임시 테이블 뷰는 무의미합니다. 처음으로 임시 테이블을 만들 수도 있습니다. – cjk