2017-11-15 2 views
-1

Ich habe ein Datensatz wie:verschieden, max und Gruppe von Abfrage in SQL

list1  list2 
a   e 
a   e 
b   w 
a   e 
a   r 
b   c 

ich am häufigsten Artikel in list2 von list1 gruppiert finden möchten.

Wie kann ich die gleiche Anzahl von Elementen wie b, w, 1 und b, c, 1 loswerden? Ich möchte eine von ihnen zufällig haben.

Ich habe versucht, so etwas wie dieses

SELECT clf1 as clf2, first(value_count) as max_value 
FROM (SELECT list1 as clf1, list2, count(list2) AS value_count FROM table GROUP BY list2,clf1 order by value_count desc) 
GROUP BY clf2 
+3

Welche dbms verwenden Sie? (Die Antwort kann von dem verwendeten Produkt abhängen.) – jarlh

+0

@jarlh Ich benutze mssql – dstx

Antwort

0

mit dieser Abfrage Versuchen:

Q1:

SELECT list1, count(list2) AS value_count FROM table GROUP BY list1; 

Dies wird Ihnen alle list1 existance;

Q2:

`SELECT list1, max(list2), count(list2) AS value_count FROM table GROUP BY list1,list2`; 

Dies wird Ihnen alle list1 existance nur mit max(list2).

+0

Es ist nicht korrekt, Es wird 'a | e | 4' für die erste Zeile zeigen –

+0

@ RadimBača Ihre Diskussion ist richtig.So habe ich aktualisiert meine Anfrage als Vorschlag. –

0
Select list1 , List2 , count(List2) AS value_count 
From table Group By list1 , List2 
+0

Es ist nicht korrekt. Es werden mehr als zwei Zeilen angezeigt. Zum Beispiel wird Zeile 'a | r | 1 'da sein. –

+0

Willkommen bei SO. Code-only-Antworten gelten nicht als guter Stil. Bitte fügen Sie 1-2 Sätze hinzu und erklären Sie, warum und wie dies das Problem löst –

0
Select list1 , List2 , count(List2) AS value_count 
From table Group By list1 , List2 
+0

Es ist nicht korrekt. Es werden mehr als zwei Zeilen angezeigt. Zum Beispiel Zeile, 'a | r | 1 'wird dort –

0

Wenn Sie nur häufigste Element in list2 von list1 gruppiert zu finden. Im Folgenden wird das Skript funktionieren.

SELECT top(1) [list1] 
     ,[list2], 
     count(*) as max 
    FROM [dbo].[tableData] 
    group by list1,list2 
    order by max desc 
+0

falsch sein, wird es nur eine Zeile zeigen –

+0

Aber der Benutzer braucht nur eine (häufigste Artikel) –

+0

Nein, er will die häufigste Artikel pro Gruppe –

0

Angenommen, Sie verwenden Mysql, ich denke, Sie könnten eine Abfrage wie diese versuchen.

Im inneren Teil der Abfrage wird eine einfache Zählung (*)/group by durchgeführt, wobei die Ergebnisse in absteigender Reihenfolge der Zählung geordnet werden.

Im zweiten Teil habe ich einen CROSS JOIN gemacht, um Variablen zu initialisieren und einen CASE mit Variablen zu definieren, um ROW_NUMBER() zu simulieren.

Im äußeren Teil werden die Ergebnisse gefiltert (nur eine Zeile für jede "Gruppe").

SELECT list1, list2, RC 
FROM (SELECT A.* 
    , CASE WHEN @gr1=list1 THEN @row_n:[email protected]_n+1 ELSE @row_n:=1 END AS RN 
    , @gr1:=list1  
    FROM (SELECT list1 
      , list2 
      , COUNT(*) AS RC 
      FROM LIST 
      GROUP BY list1, list2 
      ORDER BY list1, RC DESC) A 
    CROSS JOIN (SELECT @row_n:=1, @gr1:='') B  
    ) C 
WHERE RN=1; 

Ausgang:

list1 list2 RC 
a  e  3 
b  w  1