mysql按照每天每月等统计数据(连续不间断,当天月没有数据为0)

mysql按照每天每月等统计数据(连续不间断,当天月没有数据为0),第1张

   在统计数据的需求中很容易出现按照天来统计数据的场景,有时某一列的维度在那天并没有产生数据,但是又没有一列是可以确保每天都是有数据的,由于mysql中并没有fulljoin这样的关联方式,在这种情况下关联查询就有些费劲,解决的办法也是多种多样,毕竟条条大路通罗马嘛,其他的就不说了,这里介绍一种相对方便的方法。

   产生一个足够长的时间列,这个列要能够包含想要统计的所有日期。这个思路的实现很泛,可以创建一个日期的临时表,然后将想要查的日期插入,抛开创建表比较麻烦之外,一般在职能比较完善的公司,生产环境创建表或者修改数据是需要交给专门的DBA去 *** 作的,各种流程。。。相对这个较简单的一种方式就是创建存储过程,然后产生时间列,这也是一种解决办法。

   我的思路是先定义一个时间变量并初始化,然后和某个数据足够多的表关联查询获取时间列,这个表一般选取某张要查的表即可,数据条数只要超过需要查询的条数即可,足够即可,太多就是浪费,降低查询效率。

   比如说我要查询2018-01-10到2018-01-20每天的数据,那么就可以写成

   其中,cdate是我定义的一个时间变量,初始化的值是2018-01-09,因为在外面那部分执行之后值已经加1了,已经不是2018-01-10了;data_t是我关联产生记录的实体表,这个表只有一个要求,就是能帮我们产生足够的时间列条数,后面的limit 15是帮助我产生15条时间记录,可以换成其他条件;生成的t0其实就是15条全为2018-01-09的记录,外面的查询在每扫描一条t0的记录就会加1天,这样就会产生连续的时间列;WHERE后面是最终查询的截止条件,换成其他的也可以。

关联其他表举例:

查询从2018-01-10到当前日期每天的统计数据

  通过上面的例子我想大部分人应该可以灵活变化了,比如查询多少天内每天的统计数据,某几个月内每月的统计数据等等,通过修改上面给的例子里面的sql完全可以做到,可以说这种思路就是个‘万能模板’,希望本文能够帮到大家。

首先我们需要明白SQL语言的局限,它属于面向集合的描述性语言,该语言无法在记录间进行浏览定位,因此涉及需要进行不同记录间进行比较的问题时,它会很无力。题主这类问题最好交由应用程序端用编程的方法解决,而在数据库端单纯用SQL语言解决则会相当麻烦和低效,很多时候甚至是无解的。

下面就题主的问题尝试用纯SQL查询来实现,请参考系列实验:

-- 创建测试表并插入测试数据

DROP TABLE IF EXISTS TEST

CREATE TABLE TEST (USERID VARCHAR(10),MONTHID INT)

INSERT INTO TEST VALUES

('10001',1),('10002',3),('10003',2),('10002',4),

('10002',3),('10001',2),('10001',3),('10002',12)

-- 查看测试数据

SELECT * FROM  TEST

-- 筛选出曾经连续活跃2个月和3个月的用户ID

SELECT T.USERID,

CASE WHEN MAX(T.DIFF1)=1 THEN '是' ELSE '否' END AS 连续活跃两月,

CASE WHEN MAX(T.DIFF2)=2 THEN '是' ELSE '否' END AS 连续活跃三月

FROM (SELECT A.*,

(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE

USERID=A.USERID AND MONTHID<A.MONTHID))

AS DIFF1,

(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE

USERID=A.USERID AND

MONTHID<(SELECT MAX(MONTHID) FROM TEST WHERE

USERID=A.USERID AND MONTHID<A.MONTHID))) AS DIFF2 FROM TEST A) T

WHERE T.DIFF1=1 OR T.DIFF2=2 GROUP BY T.USERID

DROP TABLE IF EXISTS TEST -- 删除测试表

实验截图

输出效果

其一:给连续相同的type编号,即大 1 大2 大3 小1 小2……,这个需要用到用户变量

其二:编号后进行条件过滤

其三:分组统计

这三个可以写成一个SQL!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6128338.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存