2017-02-04 2 views
0

ich eine postgresql Tabelle namens login_logs habe, die die folgenden Felder haben:Postgresql SELECT und zählt nach Datum

Datum, Uhrzeit, Benutzername, ip_addr

habe ich die folgende SQL, die Anmeldungen größer oder gleich wird zu ein bestimmtes Datum:

SELECT * FROM login_logs WHERE date>='2016-10-01' 

Allerdings mag ich nur Liste von Benutzername und Daten bekommen, wo ein Benutzername mehr als eine Anmeldung am selben Tag hat. Wenn zum Beispiel ein Benutzername zweimal oder öfter einen Eintrag enthält, sollte er diesen Benutzernamen zurückgeben, das Datum mit der Anzahl der Logins für diesen Tag. Wenn der Benutzer also ein anderes Datum mit mehr als zwei Logins hat, sollte dies auch mit dem Benutzernamen, dem Datum und der Anzahl angezeigt werden.

Irgendwelche Ideen, wie ich das tun kann?

+1

'date' ist ein schlechter Name für eine Spalte. So ist 'Zeit'. Übrigens: Es ist bequemer, Datum und Uhrzeit zu einem Zeitstempel zu kombinieren und diesen zu verwenden. – wildplasser

Antwort

3

So etwas wie dies tun würde, den Trick:

SELECT 
    username, 
    COUNT(*) as count, 
    date_trunc('day', date) as day 
FROM login_logs 
WHERE date>='2016-10-01' 
GROUP BY username, day 
HAVING COUNT(*) > 1 

Wir Gruppe Anmeldungen beide nach Usernamen und Tag, weil wir über Gruppen von Anmeldungen von demselben Benutzer am selben Tag wird Argumentation wollen. Dann behalten wir nur die Gruppen, die mehr als einen Eintrag haben.

0

In Postgres können Sie COUNT(DISTINC)

SELECT username, ip_addr, count(distinct date) as count_dates 
FROM login_logs 
GROUP BY username, ip_addr 
WHERE date >= '2016-10-01'; 
Verwandte Themen