[英]basic sql : selecting the same column multiple times in one query, when each occurrence is dependent on different where clause
[英]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.