0

Ich habe folgende Tabellenpostgresql - Daten, die durch Monate geteilt

enter image description here und enter image description here

Ich erhalte die Grafen von User_id pro Monat, in dem das Datum der Eintragung und Anmeldung Datum anders sein sollten. Zum Beispiel: enter image description here

Ich brauche aber die Anzahl der Unique User wie das folgende Beispiel zu erhalten:

enter image description here

wo gelbe Zellen Registrierungszahl pro Monat sind. Die anderen Daten sind unique_user, die sich in den nächsten Monaten einloggen, die sich von der Registrierung unterscheiden.

Zum Beispiel hat sich user_ID 104 am Mar angemeldet und musste sich im März, April und Mai anmelden. Ich muss Logins nach Mar sehen und geteilt durch Monate

Als eine Schlussfolgerung muss ich alle eindeutigen Benutzer sehen, die ein Login in Monaten nach dem Registrierungsmonat hat.

registration table  
User_ID month registration_date 
101 dec 12.12.2016 
102 dec 1.12.2016 
103 feb 2.2.2017 
104 mar 14.3.2017 
105 mar 14.3.2017 
106 apr 5.4.2017 
107 may 15.5.2017 
108 may 17.5.2017 
109 may 18.5.2017 

login table  
user_id month login_date 
101 dec 12.12.2016 
101 jan 1.1.2107 
103 apr 1.4.2017 
101 may 1.5.2017 
104 mar 14.3.2017 
104 mar 15.3.2017 
104 apr 1.4.2017 
104 may 5.5.2017 
105 may 15.5.2017 
+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 und die akzeptierte Antwort –

+0

Ich lese es, aber das sind nur Daten zum Beispiel ... Ich machte es in Excel für eine klare Erklärung –

Antwort

1

Wenn ich verstehe, dass Sie sich Sie so etwas wie folgt zu erhalten schreiben müssen, was Sie brauchen:

SELECT COUNT(*) cnt, reg.month reg_month, reg.month log_month 
FROM (
    SELECT DISTINCT ON (user_id, month) month 
    FROM registration_table 
) reg 
GROUP BY reg.month 
UNION ALL 
SELECT COUNT(*) cnt, reg_month, log_month 
FROM (
    SELECT reg.month reg_month, log.month log_month FROM (
    SELECT DISTINCT ON (user_id, month) user_id, month 
    FROM registration_table 
) reg 
    JOIN (
    SELECT DISTINCT ON (user_id, month) user_id, month 
    FROM login_table 
) log ON log.user_id = reg.user_id AND log.month != reg.month 
) sub 
GROUP BY reg_month, log_month 
  1. Zuerst Sie Ihren Tisch für mit 0 Werten füllen sollte jede Zelle, weil diese Abfrage nicht jeden Monat durchläuft.
  2. Dann führen Sie einfach Abfrage und für jede Zelle (reg_month, log_month) füllen Sie entsprechende cnt Wert.

Ich erstelle folgende sqlfiddle example für Sie. Es füllt die Tabelle korrekt mit Ihrem Eingabe/Ausgabe-Beispiel.

Nur ein paar Anmerkungen.

  • Ihre Tabellendaten sollten gültig sein. Z.B. keine Login Daten für nicht registrierte Benutzer
  • Nicht enthalten Jahr Verarbeitung.
+0

Danke Mann, Dein Skript war sehr nützlich, ich änderte, aber Logik war großartig! Danke noch einmal! –

+0

@DejanIvanov froh, Ihnen zu helfen. – DjezzzL

Verwandte Themen