簡體   English   中英

基本sql:在一個查詢中多次從同一列中選擇AVG()值,當每個想要的AVG()值使用不同的WHERE子句時

[英]basic sql : selecting AVG() values from the same column multiple times in one query, when each wanted AVG() value uses different WHERE clause

我想從一個表中的一個列(value_to_count)中獲得三個不同的平均值,其中所有這些平均值具有不同的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           

現在我想得到我已經得到的其他平均值。 這一次,我只想通過“在06和18之間的小時(時間)”和“在23和06之間的小時(時間)”獲得平均值。

這是我想得到的結果形式:

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

這應該這樣做:

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

我首先定義每個數據的周期,然后擔心分組和平均:

;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之間”。 請注意,我還調整了范圍以避免重復計算。

如果要明確檢查HOUR(time) between 23 and 06 (或05 HOUR(time) between 23 and 06 ,則可以執行HOUR(time) >= 23 or HOUR(time) <= 6 (或< )。 請注意,您想要OR ,而不是AND

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM