2013-08-26 3 views
0

Я пытаюсь сделать некоторые аналитики активности пользователей, в частности, сколько пользователей по-прежнему активны или, по крайней мере, регистрируются в течение определенного периода времени. Однако у меня есть некоторые конфликтующие числа с первым месяцем, который должен быть просто количеством пользователей, которые подписались в течение месяца. Чтобы понять это, мой простой запрос - это.Подсчет различий в случае-

SELECT count(user_id) 
FROM users 
WHERE date_part('year', member_since) = 2013 
AND date_part('month', member_since) = 01 

Гипотетически это возвращает «1000», который, как я считаю, является правильным из-за простоты. Но если я это сделаю ...

SELECT 
COUNT(CASE WHEN date_part('day', last_login - member_since) >= 0 
    THEN user_id END) days_0 
FROM users 
WHERE date_part('year', member_since) = 2013 
AND date_part('month', member_since) = 01 

... Он вернет число менее 1000 человек. Теоретически это должно возвращать то же число, что и выше, потому что даже если last_login - это тот же день, что и member_since, который будет равен нулю и должен считать этих пользователей. И member_since, и last_login являются типами временных меток. У меня есть догадка, что разница может быть пользователями, где last_login является тем же самым, что и member_since, что означает, что они подписались и никогда не возвращались, но я не уверен, как бы это проверить. Является ли это проблемой NULL? Если да, как я могу включить это, чтобы вернуться к счету «1000»?

+0

попробовать этот запрос '* Выберите из пользователей, где last_login является нулевым или member_since равна нулю или date_part ('день', last_login - member_since) <0' –

+0

является он возвращает что-то, чем у вас есть несколько несогласованных строк –

ответ

0

Я бы поставил доллары на пончики, что вы nulls - вот что вызывает проблему, так как они всегда будут удалять оператор else.

Чтобы исправить это, попробуйте следующее:

SELECT 
COUNT(CASE WHEN last_login is null or date_part('day', last_login - member_since) >= 0 
    THEN user_id END) days_0 
FROM users 
WHERE date_part('year', member_since) = 2013 
AND date_part('month', member_since) = 01; 
Смежные вопросы