2016-04-02 4 views
0

У меня есть следующий запрос, чтобы получить ежемесячное количество пользователей:Выполнить сложный запрос по нескольким датам

SELECT count(user_id) from subs 
where (started_at between @start_date and @start_date + interval 1 month 
or (expires_at>@start_date + interval 1 month and started_at<@start_date)) 

Если бы мы имели следующую БД:

user_id started_at expires_at

=== ==========================
1 2015-01-01 2015-12-31
2 2015-01-01 2015-01 -03
3 2015-02-01 2015-02-28
4 2015-03-01 2015-03-31
5 2015-04-01 2015-04-31
6 2015-04-01 2016-04-01
7 2015-05-01 2015-05 -09

Мне нужен запрос, который возвращает следующую таблицу:

2015-01 - 2
2015-02 - 2 (потому что одна из записей Яна не истекает до декабря)
2015- 03 - 2
2015-04 - 3
2015-05 - 3

и т.д.

Так что это эффективный способ, чтобы получить этот результат в одном запросе?

ответ

0

Вы хотите GROUP BY год и месяц.

Предполагая, что ваш столбец started_at имеет тип DATE, вы можете f.e. используйте GROUP_BY YEAR(started_at), MONTH(started_at), а также используйте DATE_FORMAT для форматирования значения столбца на одно строковое значение формы YYYY-MM и GROUP BY. Выберите то же значение, что и столбец, чтобы получить нужный идентификатор.

+0

Кажется, вы меня не получили: я хочу запустить запрос (start_at между start_date и start_date + интервал 1 месяц или (expires_at> start_date + interval 1 month и start_at

+0

Ну, если несколько человек здесь не кажутся вам, то это может быть проблемой с вашим объяснением. Перейдите к редактированию своего вопроса и включите структуры таблиц, примеры данных и ожидаемый результат. – CBroe

+0

жаль что не ясно - редактировал вопрос –

0

Вы, вероятно, хотите что-то вроде этого:

SELECT YEAR(started_at) as 'Year', 
MONTH(started_at) as 'Month', 
COUNT(user_id) as 'Users' 
FROM subs 
GROUP BY YEAR(started_at),MONTH(started_at); 

Обратите внимание, что в случае, если через месяц не имеет пользователей, этот запрос не будет возвращать запись для этого месяца. Если вы хотите также включить месяцы с 0 пользователями, вам нужен более сложный запрос; проверьте this для получения дополнительной информации.

+0

Кажется, вы не получите меня: Я хочу, чтобы выполнить запрос (started_at между датой_начала и датой_начала + интервалом 1 месяц или (expires_at> start_date + интервал 1 месяц и started_at

+0

Я с CBroe на этом. Вы должны добавить информацию, которую он упомянул, чтобы мы могли точно понять, что вы хотите. Если вы не можете обмениваться данными из своей базы данных, укажите в качестве фиктивной выборки и ожидаемых результатов. – Sevle

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