首先很抱歉,如果这是重复的,我对 SQL 还很陌生,所以我不确定在我的搜索中使用什么正确的术语
所以我有一个记录赛车的数据库,具有以下简化模式
race_table
==========
race_id PK
race_date timestamp
average_speed Decimal
max_speed Decimal
drivers
=======
driver_id PK
driver_name text
date_started timestamp
driver_races
============
driver_id FK
race_id FK
如果每个车手在 2/3 年内有大约 1000 场比赛
例如,我将如何查询给定日期范围内平均比赛速度的总体百分比变化(正负)
前 6 个月的百分比变化
Joe Smith - 5% increase
Andy James - 4% increase
前 12 个月的百分比变化
Joe Smith - 8% increase
Lewis May - 6% increase
更新:有关百分比变化的更多详细信息
百分比变化可以使用线性回归计算,(最小二乘拟合将是合适的),平均变化实际上是最佳拟合线上的 y 差,其中每个点都是一场比赛,x 是race_date 和 y 是那场比赛的平均速度。
Postgres 的 regr_slope 将给出与 %change 相同的线的梯度
SELECT regr_slope(r.average_speed, EXTRACT(EPOCH FROM r.race_date)) as slope
FROM race_table as r, driver_races as dr
WHERE dr.race_id = r.race_id
AND d.driver_id = 1
这给出了我想要的数字,但我现在需要针对所有用户应用,按“斜率”排序
数据模型
您正在节省平均值。和最大。每场比赛的速度,而不是每个车手?通常这会是这样的:
这也是您应该提供数据模型的方式:作为
CREATE
准备用于测试的脚本。numeric
并且decimal
在 Postgres 中是相同的。询问
您的查询扩展到所有驱动程序:
简单的替代方案
一个简单的替代方法是将时间段前半段的平均速度与后半段的平均速度相匹配:
该
CASE
表达式没有ELSE
分支,因为默认值NULL
很好:avg()
忽略NULL
值。-> SQLfiddle演示。