增加查询参数,直到达到LIMIT

时间:2019-05-06 01:08:46

标签: postgresql

我正在尝试寻找前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 3和5,但不返回ID 4

这是因为直到 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

1 个答案:

答案 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表。但这很难满足您的需求-我们需要立即扫描多少行表。