2016-04-06 11 views
0

Mit dieser Tabelle:Auswählen von Zeilen und Entfernen von Duplikaten basierend auf einigen Feldern basierend auf zwei Feldern und Beschränkung auf Top Ten?

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 

Wie kann ich alle Zeilen auswählen, aber doppelte Zeilen entfernen mit den Athleten in der gleichen Veranstaltung (Fields Athleten und Ereignis) haben, und wählen Sie die niedrigste (höchste Mark für diesen Athleten) , würde ich auch (in Ergebnissen nicht gezeigt)

Erwartete Ausgabe (Auswahl Bestnote), (Zeile 5 entfernt)

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 

Danke für die Hilfe wie jedes Ereignis begrenzen 10 Athleten nach oben der Abfrage das hat getan, was ich wollte (minu s die Top Ten) ist:

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

FROM [tblPerformanceData-FieldBoys] INNER JOIN MaxAthleteByEventBoysField ON ([tblPerformanceData-FieldBoys] .AthleteID = MaxAthleteByEventBoysField.AthleteID) und ([tblPerformanceData-FieldBoys] .mark = MaxAthleteByEventBoysField.MaxOfMark) UND ([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]. Markiere DESC;

Antwort

0

Sie können dies mithilfe von Cascading-Abfragen tun. Versuchen Sie, eine Gruppenabfrage in der Haupttabelle auszuführen, die nur den Athleten, das Ereignis und die Marke enthält. Die Max- oder Min-Klausel wird auf die Marke angewendet, abhängig vom Ergebnis, das Sie suchen. Verwenden Sie diese Abfrage als Quelle für eine zweite Abfrage, bei der Sie über direkte Verknüpfungen zwischen dem Athleten-, Ereignis- und Mark-Feld eine Verbindung zur ursprünglichen Tabelle herstellen. what the second query should look like

Das löst den ersten Teil. Ich bin mir nicht sicher, wie ich mithilfe von Abfragen die Top Ten für jedes Ereignis ermitteln kann.

+0

Thanks..the erste Abfrage funktionierte gerade gut, als ich die Abfrage zu den drei Feldern beschränkte ... aber konnte es nicht erhalten, mit Ihrer verbundenen Tabelle und Abfrage zu arbeiten. – Tim

+0

Sie haben die zweite Abfrage wie das Bild erstellt, das ich angehängt habe? Der Zweck der zweiten Abfrage besteht darin, die fehlenden Spalten aus Abfrage1 einzubeziehen. – iveyb123

+0

Ich baute es genau so angebracht. – Tim

0

Ich habe nicht oder habe Zugriff auf MS Access, aber ich kann Ihnen SQL, und hoffe, Access wird einige grundlegende Syntax unterstützen.

Option 1: Es ist einfacher, wenn Ihr Primärschlüssel ist, aber Sie müssen es nicht im Ergebnis zurückgeben; in diesem Fall können Sie auch beide MIN und MAX des Mark für den gleichen Athleten in der gleichen Zeile erhalten Sie eine einfache Abfrage mit:

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

Hinweis: Ich nahm die Gruppierung auch durch Meet wollen, aber wenn das nicht ist der Fall, Sie könnten es aus GROUP BY entfernen, aber dann verliert der Wert Bedeutung im Ergebnis.

Option 2: ist Primärschlüssel, aber Sie müssen es zurück - offensichtlich in diesem Fall min und max nicht in der gleichen Zeile und die Abfrage sieht ganz anders zurückgegeben werden:

 
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) 

paar Notizen :

  • obige Abfrage gibt MAX(Mark) zurück; ändern Sie es in MIN(Mark), um die niedrigsten Werte zurückzugeben
  • Diese Abfrage könnte auch mit JOIN s überschrieben werden; Ich bin mir nicht sicher, welche Methode Access besser gefällt (d. H. Schneller läuft)
  • es hat 2 Unterabfragen; die obere Unterabfrage MAX(Row) ist da, um sicherzustellen, dass nur eine Zeile ausgewählt wird, wenn derselbe Athlet in demselben Meeting und derselben Veranstaltung dieselbe Marke erhält; in diesem Fall wird die größeren zurück
  • ist es möglich, sowohl MIN und MAX mit einer Abfrage (als separate Zeilen) zurück auf Kosten der zusätzlichen Unterabfragen, aber dass Sie nicht für
fragten
Verwandte Themen