0

我正在尝试对用户活动进行一些分析,特别是在一段时间内有多少用户仍然活跃,或者至少登录。但是,我有一些与前几个月的数字相冲突的数字,这应该只是一个月内注册的用户数。为了弄清楚这一点,我的简单查询是这样的。

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

假设这会返回“1,000”,我认为这是正确的,因为它很简单。但如果我这样做...

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

...它将返回一个小于 1,000 的数字。从理论上讲,这应该返回与上面相同的数字,因为即使 last_login 与 member_since 是同一天,它也会为零并且应该计算这些用户。member_since 和 last_login 都是“时间戳”类型。我有一种预感,不同之处可能是 last_login 与 member_since 完全相同的用户,这意味着他们注册后再也没有回来,但我不确定如何测试它。这是一个 NULL 问题吗?如果是这样,我怎么能将其包括在内以恢复到“1,000”的计数?

4

1 回答 1

0

我会向甜甜圈打赌,你的空值是导致问题的原因,因为它们总是会命中 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;
于 2013-11-11T12:45:00.553 回答