我正在尝试寻找前1名低于1 km
的跑步者,但是如果满足该条件的跑步者少于5名,则将km
递增1,直到{{1 }}满足5。
唯一的警告是,如果在递增LIMIT
时发现2个或更多结果,则即使其他结果具有较低的km
,也应返回具有较高score
的结果。
最终结果集应按分数排序。
km_run
Runners
我尝试使用子查询首先返回由id runner km_run score
1 mary 3.5 0.55
2 anna 1.5 0.95
3 john 6.5 0.90
4 bill 1.5 0.15
5 jess 6.2 0.35
6 jack 2.5 0.75
排序的表,然后在外部查询上放置score
。
LIMIT
但这只会返回SELECT runner, km_run, score
FROM runners
WHERE runner IN
(SELECT runner FROM runners
ORDER BY score DESC)
ORDER BY km_run LIMIT 5
最低的5个跑步者。
相反,我要这样:
km
请注意以下几点:
这是因为直到 id runner km_run score
2 anna 1.5 0.95
3 john 6.5 0.90
6 jack 2.5 0.75
1 mary 3.5 0.55
5 jess 6.2 0.35
间隔才发现4/5个结果,然后才发现2个结果。这2个结果均比ID 4得分高,因此被纳入。
6-7 km
设置查询:
Between Results
0-1 km 0
1-2 km 2
2-3 km 1
3-4 km 1 --> here we have 4/5 results required
4-5 km 0
5-6 km 0
6-7 km 2 --> now we have 6, but we only want the 5 w/ best score
答案 0 :(得分:1)
首先获得所有排名5或更高的跑步者,其中排名基于被截断的km_run
。然后获得得分最高的5个。
在SQL中:
SELECT runner, km_run, score
FROM (SELECT runner, km_run, score,
rank() OVER (ORDER BY floor(km_run))
FROM runners) AS q
WHERE rank <= 5
ORDER BY score DESC
LIMIT 5;
runner | km_run | score
--------+--------+-------
anna | 1.5 | 0.95
john | 6.5 | 0.90
jack | 2.5 | 0.75
mary | 3.5 | 0.55
jess | 6.2 | 0.35
(5 rows)
查询效率不是很高,因为它必须扫描整个runners
表。但这很难满足您的需求-我们需要立即扫描多少行表。