开发者社区> 问答> 正文

可能最短的查询,递归检查的大查询

假设我在Big查询中有一个数据,一个月的数据量高达数百万行。例如:

dateuser
---------------------------------------
01-12-2019xyz
---------------------------------------
02-12-2019xyz
---------------------------------------
03-12-2019abc
---------------------------------------

现在,我要检索按日统计的数据,即接下来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

展开
收起
保持可爱mmm 2019-11-15 17:20:26 276 0
1 条回答
写回答
取消 提交回答
  • 内联查询应该在这里非常有效:

    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:来加快查询速度。

    2019-11-15 17:20:35
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载