2017-10-02 1 views
0

J'ai deux tables: les connexions et les visites. Logins conserve la trace des dates auxquelles un utilisateur se connecte à un site Web et le tableau visits conserve la trace de chaque utilisateur visitant un site Web. J'ai du mal à essayer d'obtenir le nombre de visites entre chaque date de connexion. Par exemple, les tableaux ressemblent à ceci:Comment obtenir le nombre de dates sans chevauchement dans SQL

Logins

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

Visites

|---------------------|------------------| 
|  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 | 
|---------------------|------------------| 

Je voudrais que ma table résultant de ressembler à ceci:

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

Actuellement I suis joignant les deux tables et un count(visits.event_date) où la condition on ressemble lik e ceci:

on visits.event_date <= logins.event_date 

Cependant, cela se traduit par visit_counts = 5 pour user_id = 12 quand login_date is 2017-09-23 bc il est aussi les dates, y compris avant 23/09/2017.

+1

postgres ou ruche? ne marquer qu'un seul. –

Répondre

0

Ne pas join. Utilisez 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; 

Ce sépare les visites et les connexions en deux colonnes distinctes et les ajoute ensuite tout. En fait, deux colonnes ne sont pas nécessaires, cela permet de voir plus facilement les totaux individuels ainsi que les totaux totaux.

+0

Je suis désolé si c'est trop demander, mais pouvez-vous m'expliquer pourquoi? – lollerskates