7

我想从一张表中的一列(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           

现在我想在我已经得到的平均值旁边获得其他平均值。这次我只想得到'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 之间”。请注意,我还调整了范围以避免重复计算。

如果要显式检查HOUR(time) between 23 and 06(or 05),可以执行HOUR(time) >= 23 or HOUR(time) <= 6(or <)。请注意,您想要OR,而不是AND

于 2012-02-27T10:18:53.470 回答