2016-08-08 13 views
-1

Ich suche nach einer Möglichkeit in MySql den am häufigsten vorkommenden Wert in einer Spalte auszuwählen.MySql: Abruf der meisten auftretenden Wert in Spalte für eine andere Spalte

z. Diese Tabelle

+-------+-------+ 
| Name | Signin| 
+-------+-------+ 
| Name1 | 1 | 
| Name1 | 2 | 
| Name1 | 1 | 
| Name1 | 3 | 
| Name1 | 2 | 
| Name1 | 2 | 
| Name2 | 4 | 
| Name2 | 5 | 
| Name2 | 5 | 
| Name2 | 5 | 
| Name2 | 5 | 
| Name2 | 6 | 
+-------+-------+ 

Die Säule Signin hat zwei = 1, drei = 2, eine = 3 Sau für die Name1 der jüngste Wert gleich 2 ist, für den Name2 der jüngste Wert 5, wie in der Spalte ist Signin sind eine = 4, vier = 5, ein = 6

das Ergebnis, das ich brauche, ist wie dies

Name1 - 2 
Name2 - 5 
+1

Mögliche Duplikat [Count Mit der Anzahl der Vorkommen finden] (http://stackoverflow.com/questions/7654978/using-count-to-find-the-number- von Vorkommnissen) –

Antwort

1

Was Sie suchen, ist der "Modus" in der Statistik genannt. Die meisten Datenbanken unterstützen mit CTEs oder Fensterfunktionen, die die Berechnung vereinfachen. Wenn Ihre Daten nicht zu groß ist, ich denke, der folgende Aggregations Trick die einfachste Methode ist:

select name, 
     substring_index(group_concat(signin order by cnt desc), ',', 1) as signin 
from (select name, signin, count(*) as cnt 
     from t 
     group by name, signin 
    ) ns 
group by name; 

Die oben funktioniert nicht immer. Eine Möglichkeit ist der Ansatz von sgeddes, der zwei Aggregationen verwendet. Ein weiterer Grund ist Variablen zu verwenden:

select ns.* 
from (select ns.*, 
      (@rn := if(@n = name, @rn + 1, 
         if(@n := name, 1, 1) 
         ) 
      ) as rn 
     from (select name, signin, count(*) as cnt 
      from t 
      group by name, signin 
      order by name, count(*) desc 
      ) ns cross join 
      (select @n := '', @rn := 0) params 
    ) ns 
where seqnum = 1; 
+0

Vielen Dank für die Antwort, es zu tun. Alles Gute – user3255412

Verwandte Themen