2016-05-31 8 views
-1

Ich habe versucht, aber nur kann nicht die Ergebnisse, so dass ich um Hilfe hier bitten. Ich habe eine Log-Tabelle für Benutzer auf Computern. Ich möchte zählen, wie oft sich ein Benutzer an einem Computer angemeldet hat, und dann den Maximalwert abrufen, sodass der maximale Benutzer als primärer Benutzer des Computers gilt.SQL zurück alle Felder von max der Anzahl

Example

+2

Welche Tabellen mit welchen exakten Spalten haben Sie? Welche rdbms verwendest du? Auch was hast du bisher probiert? – istovatis

+0

siehe [tag: greatest-n-pro-group] für viele Antworten auf diese Art von Frage. Bitte lesen Sie auch dies: http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 Warum ist es einfacher, einen Screenshot Ihres Editors zu erstellen, ihn lokal zu speichern, ihn in SO hochzuladen und ihn in der Frage zu verlinken, dann einfach den Inhalt Ihres Editors zu kopieren und einzufügen. Und sagen Sie uns, welches DBMS Sie verwenden. –

+0

Verwenden von SQL 2012 auf dem Back-End und tatsächlich nur MS Access als Abfrage-Engine verwenden. Ich habe Folgendes versucht, aber es gibt nur eine Zeile statt der Ergebnisse, die ich versuche zu erhalten, wie oben gezeigt (uh stellt die Tabelle UserHist dar.) SELECT uh.computer_id, uh.user_name, Count (uh.user_name) VON uh GROUP BY uh.computer_id, uh.user_name HAVING Count (uh.user_name) = (SELECT Max (a.cnt) FROM (SELECT uh.computer_id, COUNT (uh.user_name) AS cnt FROM uh GROUP BY uh.computer_id , uh.user_name) Als a) ' – Tom

Antwort

0
select Comp, [User], count([User]) as MaxCnt 
from TableHere 
group by Comp, [User] 
1

Je nachdem, was verwendeten DBMS, können Sie eine Fensterfunktion ROW_NUMBER() verwenden, um die Zählungen pro comp Rang. Dann ziehe die höchste Bewertung.

SELECT 
    Comp, 
    [User], 
    Cnt 
FROM 
    (SELECT 
     Comp, 
     [User], 
     COUNT(1) AS Cnt, 
     ROW_NUMBER() OVER (PARTITION BY Comp ORDER BY Count(1) DESC) AS Rnk 
    FROM UserHist 
    GROUP BY Comp, [User]) BaseTable 
WHERE Rnk = 1 
1

Sie können die Anzahl und dann wählen Sie die größte. Dies verwendet einen CTE, um die Daten mit der Anzahl und dem Rang abzurufen.

WITH CTECOMP AS 
(
SELECT COMP, [user], COUNT([USER]) [USERCOUNT], 
     RANK() OVER (PARTITION BY COMP ORDER BY COUNT([USER]) DESC) [MYRANK] 
FROM @TableData 
GROUP BY comp, [user] 
) 
SELECT * 
FROM CTECOMP 
WHERE MYRANK = 1