SQL: Gibt den häufigsten Wert für jede Person zurück

7

EDIT: Ich benutze MySQL, ich fand einen anderen Beitrag mit der gleichen Frage, aber es ist in Postgres; Ich benötige MySQL.

Erhalte den gebräuchlichsten Wert für jeden Wert einer anderen Spalte in SQL

Ich stelle diese Frage nach ausführlicher Suche auf dieser Seite und anderen, habe aber kein Ergebnis gefunden, das so funktioniert, wie ich es vorhabe.

Ich habe eine Tabelle mit Personen (Recordid, Personid, Transaktions-ID) und eine Transaktionstabelle (Transaktions-ID, Rating). Ich benötige eine einzelne SQL-Anweisung, die die häufigste Bewertung jeder Person zurückgeben kann.

Ich habe derzeit diese SQL-Anweisung, die die häufigste Bewertung für eine angegebene Personen-ID zurückgibt. Es funktioniert und vielleicht kann es anderen helfen.

%Vor%

Allerdings benötige ich eine Anweisung, die das tut, was die obige Aussage für jede personid in personTable tut.

Mein Versuch ist unten; es überschreitet jedoch mein MySQL Server.

%Vor%

Jede Hilfe, die Sie mir geben können, wäre mir sehr wichtig. Danke.

PERSONTABLE :

%Vor%

TRANSACTIONTABLE :

%Vor%

Die Ausgabe der SQL-Anweisung, nach der ich suche, lautet:

AUSGABE :

%Vor%     
abignold 16.09.2012, 11:09
quelle

2 Antworten

20

Vorläufiger Kommentar

Bitte lernen Sie, die explizite JOIN-Notation zu verwenden, nicht die alte (vor 1992) implizite Join-Notation.

Alter Stil:

%Vor%

Bevorzugter Stil:

%Vor%

Sie benötigen für jeden JOIN eine ON-Bedingung.

Außerdem sind die personID -Werte in den Daten Zeichenfolgen, keine Zahlen, also müssten Sie

schreiben %Vor%

zum Beispiel, um die Abfrage für die gezeigten Tabellen zu verwenden.

Hauptantwort

Sie suchen nach einem Aggregat eines Aggregats: In diesem Fall das Maximum einer Zählung. Also wird jede allgemeine Lösung sowohl MAX als auch COUNT beinhalten. Sie können MAX nicht direkt auf COUNT anwenden, aber Sie können MAX auf eine Spalte aus einer Unterabfrage anwenden, wenn die Spalte COUNT ist.

Erstellen Sie die Abfrage mithilfe von Test-Driven Query Design - TDQD.

Wählen Sie die Personen- und Transaktionsbewertung

aus %Vor%

Wählen Sie die Person, die Bewertung und die Häufigkeit des Auftretens der Bewertung

aus %Vor%

Dieses Ergebnis wird zu einer Unterabfrage.

Finden Sie die maximale Anzahl der Male, die die Person eine Bewertung erhält

%Vor%

Jetzt wissen wir, welches die maximale Anzahl für jede Person ist.

Erforderliches Ergebnis

Um das Ergebnis zu erhalten, müssen wir die Zeilen aus der Unterabfrage auswählen, die die maximale Anzahl haben. Beachten Sie, dass, wenn jemand 2 gute und 2 schlechte Bewertungen hat (und 2 ist die maximale Anzahl von Bewertungen desselben Typs für diese Person), dann werden zwei Datensätze für diese Person angezeigt.

%Vor%

Wenn Sie auch die tatsächliche Bewertung zählen möchten, können Sie das einfach auswählen.

Das ist ein ziemlich komplexer Teil von SQL. Ich würde es hassen, das von Grund auf neu zu schreiben. In der Tat würde ich wahrscheinlich nicht stören; Ich würde es Schritt für Schritt entwickeln, mehr oder weniger wie gezeigt. Da wir jedoch die Unterabfragen ausgearbeitet haben, bevor wir sie in größeren Ausdrücken verwenden, können wir auf die Antwort vertrauen.

WITH-Klausel

Beachten Sie, dass Standard SQL eine WITH-Klausel bereitstellt, die eine SELECT-Anweisung vorangestellt und eine Unterabfrage benennt. (Es kann auch für rekursive Abfragen verwendet werden, aber wir brauchen das hier nicht.)

%Vor%

Das ist einfacher zu schreiben. Leider unterstützt MySQL die WITH-Klausel noch nicht.

Die obige SQL-Anweisung wurde jetzt mit IBM Informix Dynamic Server 11.70.FC2 unter Mac OS X 10.7.4 getestet. Dieser Test enthüllte das in der Vorbemerkung diagnostizierte Problem. Die SQL für die Hauptantwort funktionierte korrekt, ohne dass sie geändert werden musste.

    
Jonathan Leffler 16.09.2012, 14:42
quelle
0

Für jeden, der Microsoft SQL Server verwendet: Sie haben die Möglichkeit, eine benutzerdefinierte Aggregatfunktion zu erstellen, um den gebräuchlichsten Wert zu erhalten. Beispiel 2 dieses Blogposts von Ahmed Tarek Hasan beschreibt, wie man es macht:

Ссылка

    
Jorr.it 20.12.2017 12:26
quelle

Tags und Links