Найти пользователей, которые вошли в систему в течение определенного времени после регистрации - PullRequest
0 голосов
/ 21 ноября 2018

Я пытался выяснить, как подойти к следующему:

У меня есть таблица registrations:

+---------+---------------------+
| user_id |      reg_date       |
+---------+---------------------+
| a       | 2018-11-01 20:47:46 |
| b       | 2018-11-02 21:07:15 |
| c       | 2018-11-03 05:24:31 |
+---------+---------------------+

И таблица с logins:

+---------+---------------------+
| user_id |     login_date      |
+---------+---------------------+
| a       | 2018-11-01 21:30:46 |
| a       | 2018-11-01 21:35:15 |
| a       | 2018-11-01 22:22:22 |
| ...     |                     |
+---------+---------------------+

Поэтому мне нужно получить пользователей, которые хотя бы один раз регистрировались в течение дня после регистрации (между 24 и 48 часами после регистрации) и отображать user_id, register_date и самое высокое значение для входа во второй день.

Я получил следующее решение:

WITH a 
     AS (SELECT registrations.user_id, 
                registrations.reg_date, 
                logins.login_date, 
                Row_number() 
                  OVER( 
                    partition BY registrations.user_id 
                    ORDER BY logins.login_date DESC) row_num 
         FROM   registrations 
                INNER JOIN logins 
                        ON registrations.user_id = logins.user_id 
         WHERE  logins.login_date BETWEEN Hours_add(registrations.reg_date, 24) 
                                          AND 
                                          Hours_add(registrations.reg_date, 48)) 
SELECT * 
FROM   a 
WHERE  row_num = 1 

Но я не уверен насчет своего решения, хотя оно выглядит хорошо.Не могли бы вы проверить это и предложить более простой способ рассчитать это?

1 Ответ

0 голосов
/ 21 ноября 2018

Это должно работать

SELECT r.user_id, 
       r.reg_date, 
       Max(l.login_date), 
       Count(l.login_date) 
FROM   registrations r, 
       logins l 
WHERE  r.user_id = l.user_id 
       AND l.login_date BETWEEN ( r.reg_date + interval '1' day ) AND ( 
                                r.reg_date + interval '2' day )
group by l.login_date        
having Count(l.login_date)>=1 
; 
...