7

1 つのテーブル内の 1 つの列 (value_to_count) から 3 つの異なる平均値を取得したいと考えています。これらの平均値はすべて、(時間に応じて) 異なる WHERE 句を持ちます。

サンプルデータ:

###services#### Table
service_id       value_to_count                time
-----------      -----------------------       ---------
     604                    2054               04:04:50
     604                    3444               05:00:15
     604                    2122               07:12:50
     604                    2144               09:10:50
     604                    2001               13:12:53
     602                    2011               15:00:12
     602                    2115               17:22:35
     602                    1411               20:22:12
     602                    1611               21:04:52
     602                    2111               23:43:45

現在、このクエリを使用して、18 から 23 までの時間の平均値を取得しています。

クエリ

SELECT 
service_id AS service, AVG(value_to_count) AS primetime 
FROM services 
WHERE HOUR(time) BETWEEN 18 AND 23 
GROUP BY service_id

そして、それは私にこの種の結果を与えます:

### Result #### 
service          primetime
-----------      --------------      
     604               2154           
     602               2444           

ここで、すでに取得した平均値の隣にある他の平均値を取得したいと考えています。今回は、「HOUR(time) BETWEEN 06 AND 18」と「HOUR(time) BETWEEN 23 AND 06」で平均を取得したいだけです。

これは私が取得したい結果の形式です:

### Wanted Result #### 
service          primetime          other_time_interval_1   other_time_interval_2
-----------      --------------     ----------------        ------------------
     604               2154              2352                      1842
     602               2444              4122                      1224
4

2 に答える 2

7

これはそれを行う必要があります:

SELECT service_id AS service, 
       AVG(case when HOUR(time) BETWEEN 18 AND 23 then value_to_count else null end) AS primetime,
       AVG(case when HOUR(time) BETWEEN 06 AND 18 then value_to_count else null end) AS other_time_interval_1
FROM services 
GROUP BY service_id
于 2012-02-27T09:53:52.223 に答える
3

最初に各データの期間を定義してから、グループ化と平均化について心配します。

;With ServicePeriods as (
    SELECT Service_id,value_to_count,
       CASE WHEN HOUR(time) between 18 and 22 THEN 1
            WHEN HOUR(time) between 06 and 17 THEN 2
            ELSE 3 END as period
    FROM Services
)
select Service_Id,
    AVG(CASE WHEN period=1 THEN value_to_count END) as prime_time,
    AVG(CASE WHEN period=2 THEN value_to_count END) as other_time_interval_1,
    AVG(CASE WHEN period=3 THEN value_to_count END) as other_time_interval_2
from
    ServicePeriods
group by Service_id

(実は最初は3行に分けて出力するようにしていましたが、ご要望通りにピボットしました)

私の最初CASEはすべての期間をカバーしているため、「23 から 06 の間」について考える必要はありません。二重カウントを避けるために範囲も調整したことに注意してください。

(または 05)を明示的に確認したい場合は、 (またはHOUR(time) between 23 and 06) を実行できます。ではなく、が必要であることに注意してくださいHOUR(time) >= 23 or HOUR(time) <= 6<ORAND

于 2012-02-27T10:18:53.470 に答える