首页 > 解决方案 > SQL - 仅使用常用值从 2 个不同日期获取平均时间

问题描述

我有一个包含跑步者、时间和日期的数据库。他们跑不同的轨道,但通常距离相同。我想通过仅将某条赛道与同时跑过这两条赛道的跑步者进行比较来了解某条赛道平均需要多长时间,而不仅仅是获得平均水平。因此,例如,仅使用在两个日期都跑步的人来比较 2020 年 2 月 5 日的平均时间与 2020 年 9 月 5 日的平均时间。

这可能吗?

样品表

RUNNER TIME  DISTANCE  DATE 
A      23.40 7         02/05/2020
B      24.28 7         02/05/2020
C      28.90 7         02/05/2020
A      23.60 7         09/05/2020
D      22.80 7         09/05/2020
B      14.30 4         09/05/2020

该声明将需要一个“距离”字段,因为一些跑步者可以跑不同的距离。因此,由于 A 是两个日期和相同距离的唯一跑步者,答案将是 0.2 或 -0.2,这取决于您采用哪种方式,这并不重要。

标签: sqlpostgresql

解决方案


如果我理解正确,给出的是一个距离和两个日期。您想查看两个日期跑完距离的跑步者的时间,并获得两个日期的平均跑步时间差。

您可以通过参加第 1 天和第 2 天的跑步距离来实现这一目标。

with day1 as (select runner, running_time from runs
              where distance = 1 and running_date = date '2020-02-05')
   , day2 as (select runner, running_time from runs
              where distance = 1 and running_date = date '2020-02-09')
select avg(day1.running_time - day2.running_time) average_diff
from day1 join day2 using (runner);

演示:https ://dbfiddle.uk/?rdbms=postgres_12&fiddle=1154af67b35ade42bea8b1e1cd241321

表运行

+----------+--------+--------------+-------------- +
| 距离 | 亚军 | 运行日期 | 运行时间 |
+----------+--------+--------------+-------------- +
| 7 | 1 | 2020-02-05 | 00:20:00 |
| 7 | 1 | 2020-02-09 | 00:18:00 | <- 跑步者 1 在第 2 天快了 2 分钟
| 7 | 2 | 2020-02-05 | 00:25:00 |
| 7 | 2 | 2020-02-09 | 00:19:00 | <- 跑步者 2 在第 2 天快了 6 分钟
| 7 | 3 | 2020-02-05 | 00:50:00 | <- runner 3 只在第 1 天跑
| 7 | 4 | 2020-02-09 | 00:10:00 |
| 9 | 4 | 2020-02-09 | 00:15:00 | <- 跑步者 4 在第 2 天又跑了一段距离
+----------+--------+--------------+-------------- +

结果

+---------------+
| 平均差异 |
+---------------+
| 00:04:00 | <- 跑步者 1 = 2 分钟,跑步者 2 = 6 分钟 => 平均 4 分钟
+---------------+

推荐阅读