2015-09-21 5 views
0

У меня есть таблица с именем LoginTable с двумя столбцами: id как VarChar и login_date в качестве даты. Вот небольшой пример:SQL - подсчет повторных записей по дате

+-------+------------+ 
| id | login_date | 
+-------+------------+ 
| user1 | 2014-10-15 | 
| user1 | 2014-10-15 | 
| user2 | 2014-10-15 | 
| user3 | 2014-10-15 | 
| user1 | 2014-10-16 | 
| user3 | 2014-10-16 | 
| user4 | 2014-10-16 | 
| user2 | 2014-10-17 | 
| user4 | 2014-10-17 | 
+-------+------------+ 

Я хотел бы написать запрос SQL, который показывает, на каждый день, сколько пользователей вошли в систему на следующий день. Например, 15 октября имеет 3 уникальных входа - из них 3, только 16 пользователей вошли в систему 16 октября. Вывод должен быть таким:

+------------+--------------+ 
| Date  | NextDayLogin | 
+------------+--------------+ 
| 2014-10-15 | 2   | 
| 2014-10-16 | 1   | 
| 2014-10-17 | 0   | 
+------------+--------------+ 

Моя лучшая попытка (теоретически) был такой:

SELECT 
    DISTINCT(id), 
    DATE(login_date) as 'Dates' 
FROM LoginTable t1 
INNER JOIN (
    SELECT 
     DISTINCT(id) as id2, 
     DATE(login_date) as 'DatesNew' 
    FROM LoginTable 
    WHERE 'DatesNew' = DATE(t1.login_date) + INTERVAL '1' DAY 
) t2 
ON DATE(t1.login_date) = t2.DatesNew 
AND t1.id = t2.id2 

Однако я получаю сообщение об ошибке: Unknown column t1.log_date in where clause.
Как это можно достичь? Я использую MySQL, если это имеет значение.

+0

согласно объяснению, результат для '2014-10-16' должен быть' 1'? –

+0

vkp - правильно, спасибо, что указали это. Я внедрил выход. – BogdanC

ответ

1

left join на столе с указанной датой +1 для получения нужного счета.

Fiddle with sample data

select t1.login_date, count(distinct t2.id) as nextdaylogin 
from t t1 
left join t t2 on t1.login_date = t2.login_date-1 and t1.id = t2.id 
group by t1.login_date 
0

установка Просто новый столбец может быть, называется consecutive_days

Затем каждый раз войти в систему пользователей, просто проверить curr_date против (столбец можно создать, а) last_login_datetime и если время меньше, чем за 24 часов друг от друга, установите consecutive_days = consecutive_days +1;

Если не установить его равным 0.

0

Один метод заключается в использовании связанного подзапроса:

select date(login_date), count(*) as NumOnDay, 
     (select count(*) 
     from LoginTable lt2 
     where lt2.login_date >= date_add(date(lt.login_date), interval 1 day) and 
       lt2.login_date < date_add(date(lt.login_date), interval 2 day) 
     ) as NumNextDay 
from LoginTable lt 
group by date(login_date) 
order by date(login_date); 

В вашей попытке даже нет count(), поэтому я не уверен, как вы думали о получении подсчетов.

+0

Выполнение этого не дает ожидаемого результата. Для столбца '2014-10-15'' NumNextDay' имеет значение 4 - оно должно быть 2. – BogdanC

+0

@BogdanC. , , Он должен был быть таким же, как 'NumOnDay'. Исправлена ​​ошибка по отдельности. –

Смежные вопросы