【发布时间】:2021-11-20 10:40:09
【问题描述】:
我有一个棘手的任务, 假设我们有“Racings”表,并且有 TRACK、CAR、CIRCLE_TIME 列 以下是数据的示例:
| id | track | car | circle_time |
|---|---|---|---|
| 10 | 1 | 10 | 15 |
| 9 | 1 | 10 | 14 |
| 8 | 1 | 10 | 16 |
| 7 | 1 | 10 | 15 |
| 6 | 1 | 10 | 13 |
| 5 | 2 | 10 | 7 |
| 4 | 2 | 10 | 4 |
| 3 | 2 | 10 | 5 |
| 2 | 3 | 10 | 8 |
| 1 | 3 | 10 | 10 |
我需要什么,我再添加一个 avg3_circle_time 之类的字段,它将显示每个轨道最后 3 个 circle_time 的平均时间,例如:
| id | track | car | circle_time | avg3_circle_time |
|---|---|---|---|---|
| 10 | 1 | 10 | 15 | 15 |
| 9 | 1 | 10 | 14 | 15 |
| 8 | 1 | 10 | 16 | 14.6 |
| 7 | 1 | 10 | 15 | null |
| 6 | 1 | 10 | 13 | null |
| 5 | 2 | 10 | 7 | 5.3 |
| 4 | 2 | 10 | 4 | null |
| 3 | 2 | 10 | 5 | null |
| 2 | 3 | 10 | 8 | null |
| 1 | 3 | 10 | 10 | null |
我知道它在 oracle 中是如何工作的,你可以使用类似 rowid 的东西,但是对于我不知道的 postgresql,我有一个像 .....avg(circle_time) OVER(PARTITION BY track, car.....) as avg3_circle_time..... 请帮我解决这个任务
【问题讨论】:
-
如何确定“后三名”?我的意思是什么决定了循环时间 15 是否在 14 之前?
-
@SalmanA 好的,我已经更新了我的问题并为表格添加了 id,所以我们需要对 id 进行降序排序,例如,对于轨道 1,最后一个圆圈结果是 15 和 id 10,第一个是 13,id 为 6
-
平均值也不匹配,但我假设您只是输入了随机数。
-
在
OVER(),ROWS BETWEEN..中添加显式窗口规范
标签: sql postgresql average window-functions