![](/img/trans.png)
[英]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.