【问题标题】:How to get avg time taken by grouping a particular column using sql?如何通过使用 sql 对特定列进行分组来获取平均时间?
【发布时间】:2014-09-24 03:13:00
【问题描述】:

我有一张这样的表,从中我可以得到PHXSLCSJC 数据中心中特定元日期的特定 model_id 的总数。

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 数据中心的 100 次调用平均耗时 38.6382 毫秒,耗时 168 秒,200 次调用平均耗时 34.382 毫秒,耗时 170 秒。

所以我正在考虑在这里使用加权平均值为 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 数据库。

【问题讨论】:

  • 在这种情况下,中位数的公式是什么,因为我认为传统的中位数不能从子组的中位数中计算出来?

标签: mysql sql statistics median


【解决方案1】:

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

这个查询 (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, 

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

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2017-08-12
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多