Получить 48 лучших уникальных записей из базы данных на основе отсортированного поля - PullRequest
2 голосов
/ 22 мая 2011

У меня есть таблица базы данных, за которой я беру некоторый SQL (который побеждает меня до сих пор!)

Представьте, что есть 192 спортивных клуба, которые все принимают участие в 12 соревнованиях на трек за сезон.

Так что это 2304 индивидуальных выступления за сезон (например, в 100Метрах)

Я хотел бы найти лучшие 48 (уникальных) индивидуальных выступлений из таблицы, эти 48 спортсменов затем примут участие вКонец сезона Чемпионат мира.

Итак, представьте, что 2 самых быстрых времени установлены Джоном Смитом, но его можно ввести только один раз в чемпионатах мира.Так что я бы тогда посмотрел на следующее самое быстрое время, не установленное "Джоном Смитом" ... и так далее, пока у меня не будет 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

Топ 4 уникальных отдельных исполнения

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 ]

2 голосов
/ 22 мая 2011

В основном примерно так:

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 
0 голосов
/ 23 мая 2011

попробуйте это -

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
...