Question

Je dois travailler avec un outil d'analyse qui mesure les appels de service Web à un serveur par heure. Ces mesures sont insérées dans une base de données. Ce qui suit est un extrait d’une telle mesure:

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)  

En fin de compte, j'aimerais connaître la somme de tous les achèvements de services Web par heure de la journée. Évidemment, cela peut être facilement fait avec SUM () et 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)  

Mon problème est que, dans les anciens ensembles, les appels de service Web dans les heures allant de [00 à 11] étaient déjà résumés. La simple affirmation indiquée ci-dessus mènerait donc à

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)

C'est un résultat indésirable. Pour que les anciens ensembles [00, 12, ..., 23] soient comparables aux nouveaux ensembles [00,01, ..., 23], j'aimerais avoir une déclaration faisant la moyenne de la valeur de [00] et la distribuant. sur les heures manquantes, par exemple:

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

Je peux facilement le faire en utilisant des tables ou des vues temporaires, mais je ne sais pas comment le faire sans eux.

Des idées? Parce que cela me rend fou: P

Était-ce utile?

La solution

Vous aurez besoin d'un ensemble de lignes de 12 lignes pour créer une jointure.

La solution la plus simple consiste à combiner 12 instructions SELECT dans une union:

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

Autres conseils

Vous feriez probablement mieux de le faire avec des tables / vues temporaires (je recommanderais une vue sur une table temporaire) ou vous obtiendrez une déclaration désagréable spécifique à chaque cas qui sera un cauchemar à gérer avec le temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top