我正在尝试通过ID获得最快的前三名,如果有平局,使用第二和第三最快的时间作为平局休息。因此,在下面的示例中,3和5并列第三快的时间,但3的时间介于两者之间。
优选地,结果将显示每个ID的第一、第二和第三次,并且按照每个id的第一最快、第二最快和第三最快的顺序排序。
因此,该表如下所示:
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 我正试图在一个查询中获得所有正确的结果,但我遇到了困难。
所需的输出将类似于:
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 | 发布于 2011-06-29 23:47:13
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看起来像这样
ID| Time
--------
1 | 4.52
1 | 4.52
1 | 25.77然后,第二个查询的最终输出将如下所示,这是不正确的
ID | lowesttime | secondlowest | thirdlowest
-------------------------------------------
1 | 4.52 | 25.77 | null
2 |8.46 | 10.46 | 12.43
3 |9.43 | 16.49 | 17.49发布于 2011-06-29 23:46:26
尝尝这个。它将对第一个tie值起作用。如果需要更多,则需要添加额外的左连接,并复制order by的第二部分。
这在SQL Server中有效:
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)https://stackoverflow.com/questions/6523082
复制相似问题