在MySQL中查找时间类型列的中位数

2hh7jdfx  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(109)

所以我有一个表q4_2022_data,其中每个记录是一次骑自行车,这个表中的一个列称为ride_time是每次骑行的时间。我使用MySQL并尝试使用PERCENTILE_DISC查找此列的中值,但显然不起作用。

WITH RankedRides AS (
  SELECT
    ride_time,
    ROW_NUMBER() OVER (ORDER BY ride_time) AS row_num,
    COUNT(*) OVER () AS total_rows
  FROM
    q4_2022_data
)

SELECT
  SEC_TO_TIME(
    AVG(TIME_TO_SEC(ride_time))
  ) AS median_ride_time
FROM (
  SELECT
    ride_time,
    row_num,
    total_rows
  FROM
    RankedRides
) AS subquery
WHERE
  row_num BETWEEN (total_rows DIV 2) + 1 AND (total_rows DIV 2) + 2;

字符串
这是我想出的查询,它给了我一个值00:08:00.0000,我试着用其他季度表(q1,q2,q3)来检查,并意识到每一个值都是一个整数。我得到的结果是00:10:00.0000,00:11:00.0000。有什么我可以做的,这样我就得到了确切的中位数,有人能弄清楚为什么它被四舍五入。任何帮助都很感激,谢谢。

sqserrrh

sqserrrh1#

你使用ROW_NUMBER()和ROW(*)的方法是正确的。我只是觉得你在最后的SELECT语句中计算中位数的方式需要调整。中位数的计算也应该根据行数的总数是偶数还是奇数而有所不同。至少,如果是奇数,中位数是中间值,如果是偶数,中位数是两个中间值的平均值,我希望我是正确的.现在的问题得到的结果,如00:10:00.0000描绘的图片,可能有一个舍入发生在平均值(时间_TO_SEC(骑_时间)).你应该确保平均计算是准确的.

WITH RankedRides AS (
  SELECT
    ride_time,
    ROW_NUMBER() OVER (ORDER BY ride_time) AS row_num,
    COUNT(*) OVER () AS total_rows
  FROM
    q4_2022_data
)

SELECT
  SEC_TO_TIME(
    AVG(TIME_TO_SEC(ride_time))
  ) AS median_ride_time
FROM (
  SELECT
    ride_time,
    row_num,
    total_rows
  FROM
    RankedRides
) AS subquery
WHERE
  (total_rows % 2 = 1 AND row_num = (total_rows + 1) / 2) OR
  (total_rows % 2 = 0 AND (row_num = total_rows / 2 OR row_num = total_rows / 2 + 1));

字符串

相关问题