2017-09-05 5 views
1

Ich habe Einträge mit Datum und Uhrzeit. Ich möchte, dass die Ergebnisse nach Stunden gruppiert werden (00, 01, 02) und das funktioniert, aber wenn ich die verschiedenen Benutzerzahlen ermitteln möchte, liegt ein Fehler vor.Count (Distinct x) und Group By y

Select Substr(time, 0, 2) as Hour, 
Count(date) as Hits, 
Count(Distinct ip) as Users, 
Count(Distinct X-Forwarded-For) as ForwardedUsers 
From table 
Group By Hour 

EDIT: ich die LogParser von Microsoft verwenden, und ich bin in der Lage Group By Hour zu verwenden, wie es ist, und X-Forwarded-For ist auch kein Problem. Die Frage ist, wie kann ich Count(Distinct ip) innerhalb der Gruppe von

+1

Markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. Und was ist "Count (Distinct X-Forwarded-For)"? Es ist ungewöhnlich, 'count (distinct)' mit einem numerischen Ausdruck zu verwenden. –

+0

Versuchen Sie, 'X-Forwarded-For' in Backticks zu setzen, da es Sonderzeichen enthält. –

+1

Welche DBMS verwenden Sie? Viele dbms spezifische Tipps hier ... ' – jarlh

Antwort

1

Leider LogParser nicht DISTINCT Aggregatfunktionen zusammen mit GROUP BY unterstützt. Dies sollte von der Fehlermeldung, die Sie oben mit der Abfrage erhalten klar gewesen:

Error: Semantic Error: aggregate functions with DISTINCT arguments are not supported with GROUP BY clauses

Ein Trick, den Sie tun können, ist die GROUP BY Klausel ganz zu entfernen und berechnen, anstatt COUNT DISTINCT(hourlyIp) wo hourlyIp ein String gebaut ist die Stunde mit der verketten IP Adresse. Sie müssen dann das Feld hourlyIp zurück in seine Komponenten aufteilen, wenn Sie die Ergebnisse verarbeiten.

1

verwenden Die meisten Datenbank-Engines, die nicht zulassen, dass Sie nach Alias-Namen gruppieren. Ändern Sie dies:

Group by Hour 

dazu:

Substr(time, 0, 2) 
+0

Und nach ANSI SQL dürfen nur Spalten in der GROUP BY-Klausel aufgeführt sein. – jarlh

+0

Das ist nicht das Problem :) aber thx – jonasdero