Hier ist ein vereinfachtes Beispiel für das, worüber ich rede:
%Vor%Nehmen wir an, dass jeder Schüler für diese Frage mindestens ein Prüfungsergebnis erfasst hat.
Wie würden Sie jeden Schüler mit seiner höchsten Punktzahl auswählen? Bearbeiten : ... UND die anderen Felder in diesem Datensatz?
Erwartete Ausgabe:
%Vor%Antworten mit allen Arten von DBMS sind willkommen.
Beantworten der EDITED-Frage (d. h. um auch verknüpfte Spalten zu erhalten).
In Sql Server 2005+ wäre der beste Ansatz die Verwendung einer Ranking- / Fensterfunktion in Verbindung mit einem CTE , wie folgt:
%Vor%Für eine ANSI-SQL-kompatible Lösung funktionieren eine Unterabfrage und ein Self-Join wie folgt:
%Vor%Dieser letzte geht davon aus, dass es keine duplicate student_id / max_score-Kombinationen gibt. Wenn es solche Duplikate gibt und / oder du sie entdoppeln möchtest, musst du eine andere Unterabfrage verwenden, um mit etwas Deterministischem zu entscheiden aufnehmen, um zu ziehen. Angenommen, Sie können nicht mehrere Datensätze für einen bestimmten Schüler mit demselben Datum haben, wenn Sie einen Gleichstand auf der Basis der letzten max_score brechen wollten, würden Sie etwa Folgendes tun:
%Vor%BEARBEITEN: Eine passende Deduplizierungs-Abfrage wurde hinzugefügt, dank Marks gutem Fang in Kommentaren
Mit den analytischen Funktionen von Oracle ist das einfach:
%Vor%Verwenden von MS SQL Server:
%Vor% Wenn eine Punktzahl vorhanden ist, wird das älteste Datum zurückgegeben (ändern Sie date ASC
in date DESC
, um stattdessen die neueste Zahl zurückzugeben).
Ausgabe:
%Vor%Testbett:
%Vor%Auf MySQL glaube ich, dass Sie die TOP (1) am Ende der Anweisung in ein LIMIT 1 ändern können. Ich habe das aber noch nicht getestet.
Tags und Links sql sql-server mysql oracle join