質問

1時間あたりのサーバーへの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)  

最終結果として、1時間あたりのすべての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]の値を平均して配布する1つのステートメントが欲しい不足している時間、例えば:

+------+------------+  
| 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

他のヒント

おそらく、一時テーブル/ビューを使用してこれを行うのが最善です(一時テーブルを介してビューを使用することをお勧めします)。 p>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top