найти пользователей с последовательными логинами sql запрос - PullRequest
0 голосов
/ 03 августа 2020

у меня таблица содержит 2 столбца; customer_id, login_date. Для каждого дня, если клиент вошел в систему, в таблице будет 1 запись для этого клиента.

Customer_id login_date
--------------------
1   31-Dec-2018
2   31-Dec-2018
3   31-Dec-2018
1   1-Jan-2019
2   1-Jan-2019
3   2-Jan-2019
2   2-Jan-2019
3   3-Jan-2019
3   4-Jan-2019

Мне нужно получить идентификаторы клиентов, которые входили в систему не менее 3 дней подряд . Ожидаемый результат такой, как показано ниже.

Customer_id
------
2
3

До сих пор я достиг этого с помощью запроса ниже.

select customer_id from (
select *, case when (lag(logindate,1) over (partition by customer_id order by logindate)) = dateadd(day, -1,logindate) then 1 else 0 end second_day ,
            case when (lag(logindate,2) over (partition by customer_id order by logindate)) = dateadd(day, -2,logindate) then 1 else 0 end third_day
from login_history
) a 
where a.second_day =1 and a.third_day =1;

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

1 Ответ

3 голосов
/ 03 августа 2020

Вы можете использовать lag() или lead():

select distinct customer_id
from (select t.*,
             lag(login_date, 2) over (partition by customer_id order by login_date) as prev2_login_date
      from t
     ) t
where prev2_login_date = dateadd(day, -2, login_date);

Это проверяет дату входа двумя строками позади. Если до текущего дня два дня - вуаля! Три дня подряд. Здесь используется тот факт, что у вас нет повторяющихся дат для данного клиента.

Здесь - это скрипт db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...