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

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

你好,我是yes。

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

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

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

那么问题来了,这 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 statistics
from `order` where user_id = 'xxx'
) temp GROUP BY statistics;

执行结果如下:

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

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

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

责任编辑:武晓燕 来源: yes的练级攻略
相关推荐

2024-07-29 09:49:00

SQLMySQL执行

2021-04-16 07:04:53

SQLOracle故障

2023-03-26 22:42:02

SQL关联索引

2022-02-11 14:43:53

SQL语句C/S架构

2020-07-01 09:07:52

SQL索引语句

2011-02-23 13:26:01

SQL查询优化

2020-04-17 14:16:10

SQL数据库HTTP

2024-12-17 06:20:00

MySQLSQL语句数据库

2022-05-31 13:58:09

MySQL查询语句

2023-02-26 23:31:01

SQL数据库

2024-01-03 17:42:32

SQL数据库

2021-02-09 09:50:21

SQLOracle应用

2019-04-28 09:56:15

程序员互联网脱发

2021-06-07 08:37:03

SQL 查询语句

2020-10-26 08:02:28

SQL慢查询索引

2015-03-25 19:15:08

2021-08-03 08:41:18

SQLMysql面试

2023-11-01 16:50:58

2011-08-16 11:13:05

SQL ServerSQL语句前n条订单

2011-03-10 16:02:41

点赞
收藏

51CTO技术栈公众号