Verwenden Sie LIMIT innerhalb von GROUP BY, um N Ergebnisse pro Gruppe zu erhalten?
Folgende Abfrage:
SELECT
year, id, rate
FROM h
WHERE year BETWEEN 2000 AND 2009
AND id IN (SELECT rid FROM table2)
GROUP BY id, year
ORDER BY id, rate DESC
ergibt:
year id rate
2006 p01 8
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2009 p01 4.4
2002 p01 3.9
2004 p01 3.5
2005 p01 2.1
2000 p01 0.8
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7
2006 p02 4.6
2007 p02 3.3
Was ich möchte ist nur die top-5-Ergebnisse, die für jeden id:
2006 p01 8
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7
Gibt es eine Möglichkeit, dies zu tun, verwenden eine Art von GRENZE, wie Modifizierer, die arbeiten innerhalb der GRUPPE DURCH?
InformationsquelleAutor der Frage Wells | 2010-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie GROUP_CONCAT aggregierte Funktion, um alle Jahre in einer einzigen Spalte, gruppiert nach
id
und bestelltrate
:Ergebnis:
Und dann könnten Sie FIND_IN_SET,, der gibt die position des ersten Arguments innerhalb des zweiten, zB.
Unter Verwendung einer Kombination von
GROUP_CONCAT
undFIND_IN_SET
und Filterung durch die position zurückgegeben by find_in_set, dann könnten Sie diese Abfrage verwenden, gibt nur die ersten 5 Jahre für jedes id:Finden fiddle hier.
Bitte beachten Sie, dass, wenn mehr als eine Zeile haben die gleiche rate, sollten Sie erwägen, GROUP_CONCAT(DISTINCT rate, UM VON der Geschwindigkeit) auf die Spalte rate statt die Jahr-Spalte.
Die maximale Länge der Zeichenfolge zurückgegeben, die durch GROUP_CONCAT ist begrenzt, so funktioniert dies auch, wenn Sie müssen Sie ein paar Datensätze für jede Gruppe.
InformationsquelleAutor der Antwort fthiella
Die original Abfrage verwendet die Benutzer-Variablen und
ORDER BY
auf abgeleitete Tabellen; das Verhalten der beiden Macken ist nicht garantiert. Überarbeitete Antwort wie folgt.Können Sie Arme Mann Rang über partition zur Erreichung der gewünschten Ergebnis. Nur outer-join der Tabelle mit sich selbst, und für jede Zeile die Anzahl der Zeilen weniger als:
Beachten Sie, dass:
Ergebnis:
InformationsquelleAutor der Antwort Salman A
Für mich so etwas wie
funktioniert perfekt. Keine komplizierten Abfrage.
Beispiel: get top 1 für jede Gruppe
InformationsquelleAutor der Antwort Vishal Kumar
Nein, können Sie nicht BESCHRÄNKEN Unterabfragen willkürlich (man kann es in einem begrenzten Umfang in neueren MySQLs, aber nicht für 5 Ergebnisse pro Gruppe).
Dies ist ein groupwise-maximale Art Abfrage, das ist nicht trivial zu tun, in SQL. Es gibt verschiedene Möglichkeiten zu bewältigen, was effizienter sein kann für einige Fälle, aber für die top-n im Allgemeinen werden Sie wollen, schauen Sie sich Bill ' s Antwort zu einem ähnlichen vorherigen Frage.
Wie bei den meisten Lösungen für dieses problem, es kann wieder mehr als fünf Zeilen, wenn es mehrere Zeilen mit dem gleichen
rate
Wert, so können Sie noch brauchen, eine Menge von post-processing zu überprüfen.InformationsquelleAutor der Antwort bobince
Versuchen Sie dies:
InformationsquelleAutor der Antwort Saharsh Shah
Dies erfordert eine Reihe von Unterabfragen, um die Rangfolge der Werte beschränken, führen Sie dann die Summe, während die Gruppierung der
InformationsquelleAutor der Antwort Brian L Cartwright
Bauen die virtuellen Spalten(wie RowID im Oracle)
Tabelle:
Daten:
SQL folgendermaßen:
löschen, wenn die where-Klausel in t3, es zeigt wie diese:
HOLEN Sie sich "TOP-N-Aufnahme" --> hinzufügen der "rownum <=3" in die where-Klausel(where-Klausel t3);
WÄHLEN Sie "Jahr" --> hinzufügen der "ZWISCHEN 2000 UND 2009" in der where-Klausel(where-Klausel t3);
InformationsquelleAutor der Antwort Green Blade
Dauerte einige Arbeit, aber ich thougth wäre meine Lösung, etwas zu teilen, wie es scheint elegant als auch sehr schnell.
Beachten Sie, dass dieses Beispiel spezifiziert, die für den Zweck der Frage und kann geändert werden, ganz einfach für andere ähnliche Zwecke.
InformationsquelleAutor der Antwort John
Den folgenden Beitrag: sql: Sie top-N-Eintrag pro Gruppe beschreibt den komplizierten Weg, dies zu erreichen, ohne Unterabfragen.
Verbessert es auf andere Lösungen, die hier angeboten werden durch:
Es ist jedoch nicht schön. Eine gute Lösung erzielbar wäre wurden Fenster-Funktionen (aka Video-Analyse-Funktionen) aktiviert in MySQL -- aber Sie sind es nicht.
Der trick verwendet, sagte post nutzt GROUP_CONCAT, das ist manchmal beschrieben als "poor man' s Window-Funktionen für MySQL".
InformationsquelleAutor der Antwort Shlomi Noach
Die Unterabfrage ist fast identisch mit der Abfrage. Einzige änderung ist das hinzufügen
InformationsquelleAutor der Antwort Ricky Moreno
für diejenigen wie mich, die hatte queries time-out. Ich habe die unten zu verwenden, Grenzen und alles, was von einer bestimmten Gruppe.
durchläuft es eine Liste der domains und fügt dann nur ein limit von 200 in jedem
InformationsquelleAutor der Antwort Dev-Ria
Versuchen Sie dies:
InformationsquelleAutor der Antwort MLF
Bitte, versuchen Sie unter "gespeicherte Prozedur". Ich habe bereits überprüft. Ich bin immer richtige Ergebnis, aber ohne Verwendung
groupby
.InformationsquelleAutor der Antwort Himanshu Patel