Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql wählt die oberen n maximalen Werte aus

Für n=2 könnten Sie

SELECT max(column1) m 
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) 
                      WHERE column2 = t.column2)

für jedes n könnten Sie Ansätze verwenden, die hier Rang über Partition zu simulieren.

BEARBEITEN:Eigentlich dies Artikel wird Ihnen genau das geben, was Sie brauchen.

Im Grunde ist es ungefähr so

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val 
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY
                 li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (
      SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid

Ersetzen Sie grouper mit dem Namen der Spalte, nach der Sie gruppieren möchten, und val mit dem Namen der Spalte, die die Werte enthält.

Um herauszufinden, wie genau es funktioniert, gehen Sie Schritt für Schritt von der innersten Abfrage aus und führen Sie sie aus.

Außerdem gibt es eine leichte Vereinfachung - die Unterabfrage, die mid findet kann NULL zurückgeben, wenn eine bestimmte Kategorie nicht genügend Werte hat, also sollte es COALESCE davon zu einer Konstante geben, die im Vergleich sinnvoll wäre (in Ihrem Fall wäre es MIN der Domäne des Werts, in Artikel ist es MAX).

EDIT2: Ich habe vergessen zu erwähnen, dass das LIMIT 2,1 das n bestimmt (LIMIT n,1).