当前位置:首页 >娱乐 >SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量 执行时间是操作 0.5s

SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量 执行时间是操作 0.5s

2024-06-29 05:32:07 [百科] 来源:避面尹邢网

SQL骚操作,操作一条SQL 统计近 7天、条S统计天全30天、近天全部的订单订单量

作者:是Yes呀 数据库 其他数据库 我用了一个 4w 多订单数据的用户测试了一下,执行时间是操作 0.5s ,问题主要出在临时表,条S统计天全一旦数据量起来就不太行,近天但是订单暂时没接数仓就先这样顶着了,就前期用用。操作

你好,条S统计天全我是近天yes。

最近在搞新项目,订单一直在迭代,操作这期接到个新需求,条S统计天全统计商户近 1天、近天7天、30天、全部的订单量。

SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量 执行时间是操作 0.5s

一般而言这种统计类需求都不会直接查库,而是交由数仓同学统计,然后回写到业务表或者业务同学直接读数仓表。

SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量 执行时间是操作 0.5s

但是由于这是新项目,还没接数仓,并且量还没起来,所以这期就将就着先直接查库实现。

SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量 执行时间是操作 0.5s

那么问题来了,这 SQL 咋写呢?

直接看简化的表结构:

CREATE TABLE order (  `id` bigint NOT NULL AUTO_INCREMENT,  `order_no` varchar(32) NOT NULL COMMENT '订单号',  `user_id` bigint NOT NULL COMMENT '用户id',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  PRIMARY KEY (`id`) USING BTREE,  KEY `idx_userid_createtime` (`user_id`,`create_time`) USING BTREE)

今天是 2023-09-12 ,如果我们要统计近 1 天的订单量,那么 SQL 很简单:

SELECT count(*) FROM order where user_id = 'xx' and time_create >'2023-09-12 00:00:00'

同理 7天、30天

SELECT count(*) FROM order where user_id = 'xx' and time_create >'2023-09-06 00:00:00'

SELECT count(*) FROM order where user_id = 'xx' and time_create >'2023-08-14 00:00:00'

还有全部

SELECT count(*) FROM order where user_id = 'xx'

但是这样一来需要查四次数据库!能不能整个花活,把它压缩成一条 SQL 一次性查询呢?

动脑瓜子刮了刮,还真行!看下面这条 SQL:

SELECT statistics, count(*) from (SELECT CASE  WHEN time_create > '2023-09-12 00:00:00' THEN '1' WHEN time_create > '2023-09-06 00:00:00' THEN '7' WHEN time_create > '2023-08-14 00:00:00' THEN '30' ELSE  'all'END as statisticsfrom `order` where user_id = 'xxx') temp GROUP BY statistics;

执行结果如下:

思路就是利用 case when 先给对应时间数据打个标记,存放在临时表,然后通过 group by 统计。

我用了一个 4w 多订单数据的用户测试了一下,执行时间是 0.5s ,问题主要出在临时表,一旦数据量起来就不太行,但是暂时没接数仓就先这样顶着了,就前期用用。

突然回想起前公司那时候没招数据同学,让我去整 BI, 那 SQL 写的天花乱坠,感觉把一辈子的 SQL 都写完了,SQL Boy 也不容易啊。

责任编辑:武晓燕 来源: yes的练级攻略 订单数据SQL

(责任编辑:综合)

    推荐文章
    热点阅读