2017-10-02 2 views
0

Ich habe zwei Tabellen: Logins und Besuche. Logins verfolgt Daten, die ein Benutzer an einer Website anmeldet, und die Tabelle visits verfolgt jeden Benutzer, der eine Website besucht. Ich habe Probleme, die Anzahl der Besucherzahlen zwischen jedes Login-Datum zu bekommen. Zum Beispiel sehen die Tabellen wie folgt aus:So erhalten Sie nicht überlappende Datumsangaben in SQL

Logins

|---------------------|------------------| 
|  user_id  | login_date | 
|---------------------|------------------| 
|   12   | 2017-09-21 | 
|---------------------|------------------| 
|   12   | 2017-09-23 | 
|---------------------|------------------| 
|   149   | 2016-02-07 | 
|---------------------|------------------| 

Besuche

|---------------------|------------------| 
|  user_id  | visit_date | 
|---------------------|------------------| 
|   12   | 2017-09-21 | 
|---------------------|------------------| 
|   12   | 2017-09-21 | 
|---------------------|------------------| 
|   12   | 2017-09-22 | 
|---------------------|------------------| 
|   12   | 2017-09-23 | 
|---------------------|------------------| 
|   12   | 2017-09-24 | 
|---------------------|------------------| 
|   149   | 2016-02-07 | 
|---------------------|------------------| 

ich für meine resultierende Tabelle möchte wie folgt aussehen:

|---------------------|------------------|------------------| 
|  user_id  | login_date | visit_counts | 
|---------------------|------------------|------------------| 
|   12   | 2017-09-21 |   3  | 
|---------------------|------------------|------------------| 
|   12   | 2017-09-23 |   2  | 
|---------------------|------------------|------------------| 
|   149   | 2016-02-07 |   1  | 
|---------------------|------------------|------------------| 

Derzeit I bin beitreten beide Tabellen und eine count(visits.event_date), wo die on Zustand aussieht e dies:

on visits.event_date <= logins.event_date 

Dies führt jedoch in visit_counts = 5 für user_id = 12 wenn login_date is 2017-09-23 bc es auch um die Termine zu 2017.09.23 vor inklusive ist.

+1

Postgres oder Bienenstock? tag nur eins. –

Antwort

0

Do not join. Verwenden Sie union all:

select user_id, login_date, sum(logins) as logins, sum(visits) as visits, 
     sum(logins + visits) as total 
from ((select user_id, login_date as dte, 1 as logins, 0 as visits 
     from logins 
    ) union all 
     (select user_id, visit_date, 0, 1 
     from visits 
    ) 
    ) lv 
group by user_id, dte; 

Diese trennt die Besuche und Anmeldungen in zwei separaten Spalten und dann fügt sie alle. Tatsächlich werden zwei Spalten nicht benötigt, es macht es einfacher, die individuellen Summen als auch die Gesamtsummen zu sehen.

+0

es tut mir leid, wenn dies zu viel verlangt, aber können Sie mir erklären warum? – lollerskates

Verwandte Themen