假设我在Big查询中有一个数据,一个月的数据量高达数百万行。例如:
date | user |
--------------------- | ------------------ |
01-12-2019 | xyz |
--------------------- | ------------------ |
02-12-2019 | xyz |
--------------------- | ------------------ |
03-12-2019 | abc |
--------------------- | ------------------ |
现在,我要检索按日统计的数据,即接下来14天的重复用户数,即首次访问01-12-2019的用户,然后是接下来14天再次访问的重复用户数(02- 12-2019-15-12-2019)。我想出了使用以下查询来检索相同方法的方法,但是对于某些特定日期。
SELECT '2019-12-01' AS visit_date, COUNT(DISTINCT user) AS visitors_count FROM user_data
WHERE date = '2019-12-01' AND user IN (SELECT user FROM user_data
WHERE date between DATE_ADD('2019-12-01', INTERVAL 1 DAY) AND DATE_ADD('2019-12-01', INTERVAL 14 DAY) ) GROUP BY 1 我可以使用的一种方法是UNION ALL,这肯定不是最好的解决方案,这就是为什么愿意了解一些我必须习惯的最佳实践的原因。
问题来源于stack overflow
内联查询应该在这里非常有效:
select date, ( select count(distinct u1.user) from user_data u1 where u1.date between date_add(u.date, interval 1 day) and date_add(u.date, interval 14 day) ) visitors_count from (select distinct date from user_data) u 为了提高性能,您需要在上建立索引(date, user)。
如果您有一个引用表,其中包含该表中可用的日期列表,则可以使用if而不是执行select distinct:来加快查询速度。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。