我认为这可以更简单/更快:
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已经提到了索引以使其快速。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)