选择过去3项比赛中未获得第一名的终点

选择过去3项比赛中未获得第一名的终点,第1张

选择过去3项比赛中未获得第一名的终点

我认为这可以更简单/更快:

SELECt day, place, athleteFROM  (   SELECt *, min(place) OVER (PARTITION BY athlete        ORDER BY day        ROWS 3 PRECEDING) AS best   FROM   t   ) subWHERe  best > 1

- > SQLfiddle的

使用聚合函数

min()
作为窗口函数来获取最后三行加上当前行的最小位置。
然后
best > 1
必须在下一个查询级别对“ no win”()进行细微的检查,因为在子句 之后
应用了窗口函数
WHERe
。因此,您需要至少一个CTE的子选择条件才能满足窗口函数结果的条件。

手册中有关窗口函数调用的详细信息。特别是:

如果

frame_end
省略,则默认为
CURRENT ROW

如果

place
finishing_pos
)可以为NULL,请改用以下方法:

WHERe  best IS DISTINCT FROM 1

min()
忽略
NULL
值,但是如果框架中的所有行均为
NULL
,则结果为
NULL

不要使用类型名称和保留字作为标识符,我会用

day
您代替
date

假设每天最多进行1场比赛,否则您必须定义如何在时间轴上与同龄人打交道或使用

timestamp
代替
date

@Craig已经提到了索引以使其快速。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4926029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存