我正在尝试查看过去30天产品的活跃用户数量(玩具示例)。
我正在考虑两种方法。
一个,date_sub
用于查找结束日期之前29天(间隔为30天,包括开始日期)。然后,由该较早的日期和结束日期定义where
窗口。
这是示例:
SELECT
activity_date AS day,
COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE
activity_date
BETWEEN
DATE_SUB(DATE("2019-07-27"), INTERVAL 29 DAY)
AND
DATE("2019-07-27")
第二种方法是从开始日期计算datediff
,然后将where子句限制为上一个时间段。
# Write your MySQL query statement below
SELECT
activity_date as day,
COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE
datediff('2019-07-27', activity_date) < 30
and
activity_date <= '2019-07-27'
我不知道哪个是更好的选择。我希望其他人能参与进来。
使用第一个选项:
activity_date
BETWEEN DATE_SUB(DATE("2019-07-27"), INTERVAL 29 DAY)
AND DATE("2019-07-27")
这会将存储的值直接与日期分类比较。这样的表达式可以利用date列上的索引。
In,对照第二个表达式,将日期函数datediff()
应用到date列。这使表达式不可SARGable,这意味着它将不会使索引受益:
datediff('2019-07-27', activity_date) < 30
and activity_date <= '2019-07-27'
请注意,第一个表达式可以简单地写成:
activity_date >= '2019-07-27' - interval 29 day
and activity_date <= '2019-07-27'
我不确定第二个比较是否应该是>=
而不是>
。之所以有意义,是因为activitydate
没有时间成分。但我建议使用<
,因为它在两种情况下都适用;如果要在包含'2019-07-27'
之前保留数据,可以执行以下操作:
activity_date >= '2019-07-27' - interval 29 day
and activity_date < '2019-07-28'