代码之家  ›  专栏  ›  技术社区  ›  AKIWEB

如何获得使用sql对特定列进行分组所花费的平均时间?

  •  2
  • AKIWEB  · 技术社区  · 10 年前

    我有一张这样的桌子,我从中得到了总数 call_count 对于特定的 model_id 在里面 PHX , SLC SJC 数据中心。

    machine_name    hour_of_day     sec_of_hour     meta_date               client_id       model_id    call_count      avg         median      datacenter
    
    machineA            13              168         2014-07-30 00:00:00      Test13N           65           100         38.6382       5         PHX
    machineA            13              170         2014-07-30 00:00:00      Test13N           65           200         34.382        4         PHX
    machineB            13              168         2014-07-30 00:00:00      Test13N           65           200         33.62         3         SLC
    machineB            13              170         2014-07-30 00:00:00      Test13N           65           300         32.60         2         SLC
    machineC            13              168         2014-07-30 00:00:00      Test13N           65           400         31.20         6         SJC
    machineC            13              170         2014-07-30 00:00:00      Test13N           65           500         39.82         8         SJC
    

    因此,使用以下查询-

    SELECT client_id, model_id, 
      sum(case when datacenter = 'PHX' then call_count END) phx, 
      sum(case when datacenter = 'SLC' then call_count END) slc, 
      sum(case when datacenter = 'SJC' then call_count END) sjc 
    FROM models b 
    where meta_date= CURDATE()-1 
    group by client_id, model_id 
    order by client_id, model_id;
    

    我得到的结果是,对于model_id 65,从phx发出了300个呼叫,从slc发出了500个呼叫,而从sjc数据中心发出了900个呼叫。

    client_id   model_id    phx     slc     sjc
    
    Test13N       65        300     500     900
    

    问题陈述:-

    现在我应该做的是,我还需要展示 avg PHX、SLC和SJC数据中心针对特定model_id的所有调用所花费的时间。对于 median 以及PHX、SLC和SJC数据中心。

    这意味着PHX数据中心中300个呼叫所用的平均时间和PHX数据集中300个呼叫的平均时间是多少。SLC和SJC也是如此。

    我想在这里使用加权平均值。由于使用了机器A的上表,PHX数据中心在168秒的时间内,100次呼叫平均耗时38.6382毫秒,在170秒的时间里,200次呼叫平均花费34.382毫秒。

    因此,我正在考虑使用加权平均值来计算PHX数据中心的平均值-

    (100 * 38.6382 + 200* 34.382) / (100 + 200)
    

    所以最后我需要像这样展示结果-

    client_id   model_id    phx     slc     sjc     phx_avg     phx_median      slc_avg     slc_median      sjc_avg     sjc_median
    
    Test13N       65        300     500     900
    

    我如何在我当前的sql中容纳上述公式,以便我可以计算PHX中300个调用所用的平均时间和PHX中的300个调用的平均时间。SLC和SJC也是如此。我正在使用mysql数据库。

    1 回复  |  直到 10 年前
        1
  •  1
  •   O. Jones    10 年前

    您使用加权平均值计算平均时间的想法是完美的。

    此查询( http://sqlfiddle.com/#!2/031211/5/0 )工作做得很好。

    SELECT ... 
      sum(case when datacenter = 'PHX' then call_count END) phx, 
      sum(case when datacenter = 'PHX' then call_count * avg END)/
      sum(case when datacenter = 'PHX' then call_count END) phx_avg, 
    

    你没有足够的信息来计算中位数;这需要存在进入表中显示的中间值的详细记录。你可以以某种方式伪造计算结果。但如果你的交通工程师将他们的工作建立在一个假的中值计算上,你的公司会感到抱歉。不要那样做!