首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询第一、第二、第三位,使用第二位和第三位打破平局,每次在一行

查询第一、第二、第三位,使用第二位和第三位打破平局,每次在一行
EN

Stack Overflow用户
提问于 2011-06-29 23:20:56
回答 2查看 1.1K关注 0票数 2

我正在尝试通过ID获得最快的前三名,如果有平局,使用第二和第三最快的时间作为平局休息。因此,在下面的示例中,3和5并列第三快的时间,但3的时间介于两者之间。

优选地,结果将显示每个ID的第一、第二和第三次,并且按照每个id的第一最快、第二最快和第三最快的顺序排序。

因此,该表如下所示:

代码语言:javascript
复制
 ID | TIME
----|-------  
 1  |  6.45  
 2  |  12.43  
 1  |  4.52  
 4  |  16.24  
 5  |  9.43  
 2  |  10.46  
 2  |  8.46  
 3  |  17.49  
 4  |  20.46  
 3  |  16.49  
 5  |  16.97  
 3  |  9.43  
 1  |  25.77  

我正试图在一个查询中获得所有正确的结果,但我遇到了困难。

所需的输出将类似于:

代码语言:javascript
复制
 ID | lowest time | 2nd lowest | 3rd lowest
----|-------------|------------|------------ 
 1  |  4.25       | 6.45       | 25.77  
 2  |  8.46       | 10.46      | 12.43  
 3  |  9.43       | 16.49      | 17.49
 5  |  9.43       | 16.97      |   
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-29 23:47:13

代码语言:javascript
复制
CREATE TABLE times  (ID int, theTime Decimal(5,2));

INSERT INTO times VALUES (1, 6.45),
(2, 12.43),  
(1, 4.52),
(4, 16.24),
(5, 9.43),
(2, 10.46),
(2, 8.46),
(3, 17.49),
(4, 20.46),
(3, 16.49),
(5, 16.97),
(3, 9.43),
(1, 25.77);


SELECT DISTINCT
    id,
    (SELECT thetime FROM times t2 WHERE t.iD = t2.id 
     order by thetime limit 1) lowesttime,
    (SELECT thetime FROM times t2 WHERE t.iD = t2.id 
     order by thetime limit 1,1) secondlowest,
    (SELECT thetime FROM times t2 WHERE t.iD = t2.id 
     order by thetime limit 2,1) thirdlowest
 FROM 
    times t
 ORDER BY
    lowesttime,
    secondlowest,
    thirdlowest
LIMIT 3   ; 



SELECT t1.id, 
       Min(t1.thetime) lowesttime, 
       Min(t2.thetime) secondlowest, 
       Min(t3.thetime) thirdlowest 
FROM   times t1 
       LEFT JOIN times t2 
         ON t1.id = t2.id 
            AND t1.thetime < t2.thetime 
       LEFT JOIN times t3 
         ON t2.id = t3.id 
            AND t2.thetime < t3.thetime 
GROUP  BY t1.id 
ORDER  BY lowesttime, 
          secondlowest, 
          thirdlowest 
LIMIT  3 ;

我认为第二个会更快,但我不是很确定,

请注意,正如btilly指出的,如果ID1看起来像这样

代码语言:javascript
复制
ID| Time
--------
1 | 4.52
1 | 4.52
1 | 25.77

然后,第二个查询的最终输出将如下所示,这是不正确的

代码语言:javascript
复制
ID | lowesttime | secondlowest | thirdlowest
-------------------------------------------
1  | 4.52       | 25.77        | null
2  |8.46        | 10.46        | 12.43
3  |9.43        | 16.49        | 17.49
票数 5
EN

Stack Overflow用户

发布于 2011-06-29 23:46:26

尝尝这个。它将对第一个tie值起作用。如果需要更多,则需要添加额外的左连接,并复制order by的第二部分。

这在SQL Server中有效:

代码语言:javascript
复制
SELECT r1.ID, MIN(r1.time)
FROM #r r1
LEFT JOIN #r r2 
    on r1.Time = r2.Time
    AND r1.ID <> r2.ID
GROUP BY r1.id
ORDER BY MIN(r1.Time), MIN(CASE WHEN r2.time IS NULL THEN r1.time ELSE NULL END)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6523082

复制
相关文章

相似问题

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