2015-01-04 2 views
2

Мне нужно найти общее количество активных пользователей на основе даты начала и окончания.Ежедневное количество активных пользователей за определенный диапазон дат

РЕГИСТРАЦИЯ ТАБЛИЦА

id registration_no start_date end_date 
1 1000    2014/12/01 2014/12/03 
2 1001    2014/12/01 2014/12/03 
3 1002    2014/12/02 2014/12/04 
4 1003    2014/12/02 2014/12/04 
5 1004    2014/12/02 2014/12/04 
6 1005    2014/12/03 2014/12/05 
7 1006    2014/12/05 2014/12/06 
8 1007    2014/12/05 2014/12/09 
9 1008    2014/12/06 2014/12/10 
10 1009    2014/12/07 2014/12/11 

Результат должен быть в следующем формате.

Date  Active Users 
2014-12-01 2 
2014-12-02 5 
2014-12-03 6 
2014-12-04 4 
2014-12-05 3 
2014-12-06 3 
2014-12-07 3 
2014-12-08 3 
2014-12-09 3 
2014-12-10 2 
2014-12-11 1 
2014-12-12 0 

Я знаю, что следующий запрос не работает.

SELECT start_date, count(*) FROM registration 
WHERE start_date >= '2014/12/01' AND end_date <='2014/12/12' 
GROUP BY start_date 

Который не желаемый результат:

2014-12-01 2 
2014-12-02 3 
2014-12-03 1 
2014-12-05 2 
2014-12-06 1 
2014-12-07 1 

Любая помощь будет оценена.

+0

выглядит хорошо для меня. попробуйте простой выбор без группы. Вы получаете ожидаемые записи? – koriander

+0

Используя мой запрос будет получать следующий результат: 2014-12-01 2 2014-12-02 3 2014-12-03 1 2014-12-05 2 2014-12-06 1 2014-12- 07 1 –

+0

Полученные вами результаты - это то, что я ожидал бы по вашему запросу. Когда вы группируете дату начала, вы, по сути, говорите ей, чтобы она возвращала одну строку за уникальную дату начала. не уверен, как получить ответ, который вы ищете в raw sql. – Sam

ответ

3

Вам нужно создать «календарь» с все дни вам нужно, а затем использовать запрос типа:

SELECT calDay as `Date`, count(id) as `Active Users` 
FROM (SELECT cast('2014-12-01' + interval `day` day as date) calDay 
     FROM days31 
     WHERE cast('2014-12-01' + interval `day` day as date) < '2014-12-12') calendar 
LEFT JOIN registration on (calDay between start_date and end_date) 
GROUP BY calDay 
ORDER BY calDay; 

Вы можете видеть, что работает в этом fiddle, где days31 это просто вид с целыми числами 0-30. Это позволяет запросить работу в любом календаре до 31 дня. Вы можете добавить больше дней в представление или сгенерировать их на лету, используя кросс-соединения. См. http://www.artfulsoftware.com/infotree/qrytip.php?id=95

+0

Это великолепный материал! Работает отлично. Большое спасибо @koriander. –

+0

не проблема, просто известные трюки – koriander

1

Попробуйте .... обратите внимание на то, где условия для 2014-12-02, согласно комментарий

SELECT DATE_FORMAT(start_date,'%Y-%m-%d')as Date, count(*) as ActiveUser FROM registration 
WHERE (start_date >= '2014/12/02' AND end_date <='2014/12/02') 
GROUP BY start_date 
+0

Этот запрос похож на мой, который не дает желаемого результата. См. Мой обновленный вопрос. –

+0

Не могли бы вы рассказать мне, какие критерии вы ожидаете? 2014-12-01 2 2014-12-02 5 2014-12-03 6 2014-12-04 4 2014-12-05 3 2014 -12-06 3 2014-12-07 3 2014-12-08 3 2014-12-09 3 2014-12-10 2 2014-12-11 1 2014-12-12 0 –

+0

На 2014 -12-02 активны следующие пользователи: 1000, 1001, 1002, 1003, 1004 as '2014-12-02'> = start_date И 2014-12-02 <= end_date. –

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