2016-04-06 2 views
0

Имея эту таблицу:Выбор строк и удаление дубликатов на основе некоторых полей на основе двух полей и ограничение на десятку?

Row Athlete Event  Mark   Meet 
    1  1  3   10    A 
    2  2  2   5    A 
    3  3  3   3    A 
    4  4  4   7    A 
    5  2  2   4    A 
    6  3  2   5    B 
    7  1  1   10    C 

Как я могу выбрать все строки, но удалить дубликаты строк с иметь спортсмен в том же событии (поля спортсмен и событие), и выбрать самый низкий (или высокий Марк для этого спортсмена) Я хотел бы также, чтобы ограничить каждое событие к началу 10 спортсменов (не показан в результатах)

Ожидаемый выход (выбор высший балл), (строка 5 удаляется)

Row Athlete Event  Mark   Meet 
    1  1  3   10    A 
    2  2  2   5    A 
    3  3  3   3    A 
    4  4  4   7    A 
    6  3  2   5    B 
    7  1  1   10    C 

Спасибо за помощь, то запрос я сделал то, что хотел (мин. с верхней десять) является:

SELECT [tblPerformanceData-FieldBoys] .Eventnum, [tblPerformanceData- FieldBoys] .Mark, [tblPerformanceData-FieldBoys] .Meet, [tblPerformanceData-FieldBoys] .CY, [tblPerformanceData-FieldBoys]. AthleteID, [tblPerformanceData-FieldBoys] .MeetID

ОТ [tblPerformanceData-FieldBoys] INNER JOIN MaxAthleteByEventBoysField ПО ([tblPerformanceData-FieldBoys] .AthleteID = MaxAthleteByEventBoysField.AthleteID) И ([tblPerformanceData-FieldBoys] .Mark = MaxAthleteByEventBoysField.MaxOfMark) AND ([tblPerformanceData-FieldBoys] .Eventnum = MaxAthleteByEventBoysField.Eventnum)

GROUP BY [tblPerformanceData-FieldBoys] .Eventnum, [t blPerformanceData-FieldBoys] .Mark, [tblPerformanceData-FieldBoys] .Meet, [tblPerformanceData-FieldBoys] .CY, [tblPerformanceData-FieldBoys] .AthleteID, [tblPerformanceData-FieldBoys] .MeetID

ORDER BY [tblPerformanceData-FieldBoys]. Марк DESC;

ответ

0

Вы можете сделать это, используя каскадные запросы. Попробуйте запустить групповой запрос в главной таблице, который включает только спортсмена, события и отметку. Предложение max или min будет применено к знаку в зависимости от результата, который вы ищете. Используйте этот запрос в качестве источника для второго запроса, где вы связываетесь с исходной таблицей, используя прямые ссылки между полем спортсмена, события и поля. what the second query should look like

Это решает первую часть. Я не уверен, как получить первую десятку для каждого события, используя запросы.

+0

Спасибо .. первый запрос работал очень хорошо, когда я ограничил запрос тремя полями ... однако не смог заставить его работать с вашей связанной таблицей и запросом. – Tim

+0

вы построили второй запрос, как изображение, которое я приложил? Цель второго запроса - включить отсутствующие столбцы из query1. – iveyb123

+0

Я построил его точно так же, как прилагается. – Tim

0

У меня нет или у меня есть доступ к MS Access, но я могу дать вам SQL и надеюсь, что Access будет поддерживать некоторый базовый синтаксис.

Вариант 1: это легче, если является вашим основным ключом, но вам не нужно возвращать его в результате; в этом случае вы даже можете получить как MIN и MAX в Mark для того же спортсмена в той же строке, используя простой запрос:

 
SELECT 
    Athlete, Event, Meet, MAX(Mark) AS HighestMark, MIN(Mark) AS LowestMark 
FROM 
    MyTable 
GROUP BY 
    Athlete, Event, Meet 

Примечание: Я предположил, что вы также хотите сгруппировать по Meet, но если это не случай, вы можете удалить его с GROUP BY, но тогда его значение теряет смысл в результате.

Вариант 2: является первичным ключом, но вы должны вернуть его - очевидно, в этом случае мин и макс не могут быть возвращены в том же ряду, и запрос выглядит совсем иначе:

 
SELECT 
    Row, Athlete, Event, Mark, Meet 
FROM 
    MyTable m0 
WHERE m0.Row IN 
    (SELECT MAX(Row) 
    FROM MyTable m1 
    WHERE 
    Athlete = m0.Athlete AND 
    Event = m0.Event AND 
    Meet = m0.Meet 
    Mark = (SELECT MAX(Mark) 
      FROM MyTable 
      WHERE 
       Athlete = m1.Athlete AND 
       Event = m1.Event AND 
       Meet = m1.Meet) 
    GROUP BY 
    Athlete, Event, Meet, Mark) 

Несколько замечаний :

  • над запрос возвращает MAX(Mark); измените его на MIN(Mark), чтобы вернуть самые низкие значения
  • этот запрос может быть переписан с помощью JOIN s; Я не уверен, какой метод доступа лучше нравится (т. Е. Работает быстрее)
  • имеет 2 подзапроса; верхний подзапрос MAX(Row) должен убедиться, что выбрана только 1 строка, если тот же спортсмен в одном и том же собрании и событии получает тот же знак; в этом случае, тем больше возвращается
  • можно вернуть как MIN и MAX с одним запросом (в виде отдельных строк) за счет дополнительных подзапросов, но вы не просили
Смежные вопросы