这里的目的是查看一段时间内的用户保留率。
我当前的解决方案使用临时表,因为我在多个范围内执行此操作。
CREATE TEMPORARY TABLE user_retention_temp (first DATE, last DATE, amount INT);
INSERT INTO user_retention_temp
(SELECT MIN(ymd) AS first, MAX(ymd) AS last, player_id FROM day_item GROUP BY player_id);
在这里,我希望将此查询限制为仅匹配在特定时间段内具有第一个/最后一个的 player_id。
相反,我不得不为随后的查询这样做:
SELECT LEAST(last - first, 7) AS diff, count(*) AS amount
FROM user_retention_temp
WHERE first >= ? AND last < ? GROUP BY diff
这非常糟糕,因为我正在用大量不需要的数据填充临时表。
有没有更快的方法?假设至少有 2-3 百万个条目,day_item
并且我们需要的所有内容都已编入索引。
这应该工作: