根据排序的字段从数据库中检索前48个唯一记录

时间:2011-05-21 23:10:17

标签: sql recordset

我有一些数据库表,我正在使用SQL(到目前为止,这让我失败了!)

想象一下,每个赛季有192个运动俱乐部参加12场赛道会议。

这是每季2304次个人表演(例如在100Metres中)

我想从表中找到前48名(独特)个人表演,这48名运动员随后将参加本赛季世界锦标赛的结束。

所以想象两个最快的时间都是由“约翰史密斯”设定的,但他只能在世界冠军中输入一次。所以我会寻找未被“约翰史密斯”设定的下一个最快的时间...等等,直到我有48名独特的运动员......

希望有道理。

如果有人可以提供帮助,请提前致谢

PS 我确实有一个很好的屏幕截图创建,可以更好地解释它。但作为新用户,我无法发布图片。

我会尝试复制并粘贴版本......

ID  AthleteName AthleteID   Time
1   Josh Lewis      3   11.99
2   Joe Dundee      4   11.31
3   Mark Danes      5   13.44
4   Josh Lewis      3   13.12
5   John Smith      1   11.12
6   John Smith      1   12.18
7   John Smith      1   11.22
8   Adam Bennett    6   11.33
9   Ronny Bower     7   12.88
10  John Smith      1   13.49
11  Adam Bennett    6   12.55
12  Mark Danes      5   12.12
13  Carl Tompkins   2   13.11
14  Joe Dundee      4   11.28
15  Ronny Bower     7   12.14
16  Carl Tompkin    2    11.88
17  Nigel Downs     8   14.14
18  Nigel Downs     8   12.19

四大独特个人表演

1   John Smith      1   11.12
3   Joe Dundee      4   11.28
5   Adam Bennett    6   11.33
6   Carl Tompkins   2   11.88

2 个答案:

答案 0 :(得分:2)

基本上是这样的:

select top 48 * 
  from (
         select athleteId,min(time) as bestTime
           from theRaces
          where raceId = '123'  -- e.g., 123=100 meters
          group by athleteId
       ) x
 order by bestTime 

答案 1 :(得分:0)

试试这个 -

select x.ID,  x.AthleteName , x.AthleteID , x.Time 
(
 select rownum tr_count,v.AthleteID AthleteID, v.AthleteName AthleteName, v.Time Time,v.id id
 from 
 (
     select 
     tr1.AthleteName AthleteName, tr1.Time time,min(tr1.id) id, tr1.AthleteID AthleteID
     from theRaces tr1
     where time = 
            (select min(time) from theRaces tr2 where tr2.athleteId = tr1.athleteId)
     group by tr1.AthleteName, tr1.AthleteID, tr1.Time
     having tr1.Time = ( select min(tr2.time) from theRaces tr2 where tr1.AthleteID =tr2.AthleteID)
     order by tr1.time 
  ) v
 ) x 
where x.tr_count < 48