我有一张桌子,可以记录 run 情况.它有以下列:

ID distance run_time run_date
1 10 01:35:00 2023-12-04
2 10 01:41:00 2023-12-05

我想计算特定日期范围内每英里的平均速度(格式为mm:ss).例如,日期范围为12/04-12/05,则每英里的速度为09:48.第一步是计算出总里程和分钟数.然后用分钟数除以总里程数.最后一步是将分钟数转换为mm:ss格式.

以下是我到目前为止所能想到的:

with average as (
select
    runTime.totalTime / distance.totalDistance as averagePace
from
    ((
    select
        sum(distance) as totalDistance
    from
        runs
    where
        run_date >= '2023-12-04'
        and run_date <= '2023-12-05') ) as distance,
    (
    select
        extract / 60 as totalTime
    from
        (
        select
            extract(EPOCH
        from
            sum )
        from
            (
            select
                sum(run_time)
            from
                runs
            where
                run_date >= '2023-12-04'
                and run_date <= '2023-12-05'))) as runTime) 
select
    TO_CHAR((averagePace || ' minute')::interval,
    'MI:SS')
from
    average

查询计算出了正确的速度,但我觉得它不需要这么长.有没有更干净、更有效的方法来计算每英里的平均速度?

推荐答案

如果您的run_time存储为interval数据类型,则可以执行以下操作:

select to_char(sum(run_time) / sum(distance), 'mi:ss')
  from runs
 where run_date between '2023-12-04' and '2023-12-05';

请参阅this fiddle.

Sql相关问答推荐

使用交叉应用透视表在SQL中转换分段时间段&

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

为什么TRY_CONVERT返回一个XML验证错误而不是NULL?

SQL:如何取上一年的平均值?

你能过滤一个列表只返回多个结果吗?

按日期时间(不包括秒)连接表

带上最后日期(结果)

如何在SQL中从多个查询进行分组

如果另一个表中不存在值列,则插入失败

无法访问级联删除导致的触发器中已删除的外键记录

如何在android房间中进行多个加入

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

标量子查询中的窗口函数不起作用

每组使用平均值来填补缺失值的SQL

使用其他表 SUM 的交换价格转换价格并获得 AVG

为 sqlite 全文搜索 (fts) 创建触发器时出现虚拟表的不安全使用

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?