sql >> Database teknologi >  >> RDS >> Mysql

mysql vælg top n max værdier

For n=2 kunne du

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)
 

for enhver n kan du bruge fremgangsmåder beskrevet her for at simulere rang over partition.

EDIT:Faktisk dette artiklen vil give dig præcis, hvad du har brug for.

Grundlæggende er det sådan noget her

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

Erstat grouper med navnet på den kolonne, du vil gruppere efter, og val med navnet på den kolonne, der indeholder værdierne.

For at finde ud af, hvordan det præcist fungerer, gå trin-for-trin fra den mest indre forespørgsel og kør dem.

Der er også en lille forenkling - underforespørgslen, der finder mid kan returnere NULL, hvis en bestemt kategori ikke har nok værdier, så der burde være COALESCE af det til en konstant, der ville give mening i sammenligningen (i dit tilfælde ville det være MIN af domænet for val, i artiklen er det MAX).

EDIT2: Jeg glemte at nævne, at det er LIMIT 2,1, der bestemmer n (LIMIT n,1).



  1. Pad en streng med indledende nuller, så den er 3 tegn lang i SQL Server 2008

  2. Sådan overføres strengmatrix i SQL-parameter til IN-klausul i SQL

  3. XMLAGG med RTRIM-problem

  4. PostgreSQL 13:LIMIT … MED BÅND