首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增加查询参数,直到达到极限

增加查询参数,直到达到极限
EN

Stack Overflow用户
提问于 2019-05-06 01:08:45
回答 1查看 98关注 0票数 1

我正在试图找到前5名跑步者谁运行在1km,但如果有少于5的跑步者谁满足这一条件,然后增量km 1,直到5的LIMIT被满足。

唯一的警告是,如果在增量km时发现了2个或更多的结果,则应该返回具有较高score的结果,即使另一个结果的km_run较低。

最终结果集应按分数排序。

Runners

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT runner, km_run, score 
FROM runners
WHERE runner IN 
(SELECT runner FROM runners
ORDER BY score DESC)
ORDER BY km_run LIMIT 5

但这只会返回km最低的5个跑步者。

相反,我想要的是:

代码语言:javascript
复制
 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

请注意以下几点:

  • 结果按降分排序。
  • 返回ID 3和5,但不返回ID 4。

这是因为只有4/5的结果被发现,直到找到两个结果的6-7 km间隔。这两项结果的得分均优于ID4,因此将其包括在内。

代码语言:javascript
复制
 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

安装查询:

代码语言:javascript
复制
CREATE TABLE runners(
 id SERIAL,
 runner VARCHAR, 
 km_run DECIMAL,
 score DECIMAL,
 PRIMARY KEY (id)
);

INSERT INTO runners (runner, km_run, score)
VALUES ('mary', 3.5, 0.55);
INSERT INTO runners (runner, km_run, score)
VALUES ('anna', 1.5, 0.95);
INSERT INTO runners (runner, km_run, score)
VALUES ('john', 6.5, 0.90);
INSERT INTO runners (runner, km_run, score)
VALUES ('bill', 1.5, 0.15);
INSERT INTO runners (runner, km_run, score)
VALUES ('jess', 6.2, 0.35);
INSERT INTO runners (runner, km_run, score)
VALUES ('jack', 2.5, 0.75);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 05:48:06

首先,让所有的跑步者谁的排名5或更高,其中排名是基于截断的km_run。然后得到5个得分最高的。

在SQL中:

代码语言:javascript
复制
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表。但是,根据您的要求,这是不可避免的--我们需要扫描多少表行还不清楚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55997722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档