SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量
你好,我是yes。
最近在搞新项目,一直在迭代,这期接到个新需求,统计商户近 1天、7天、30天、全部的订单量。
一般而言这种统计类需求都不会直接查库,而是交由数仓同学统计,然后回写到业务表或者业务同学直接读数仓表。
但是由于这是新项目,还没接数仓,并且量还没起来,所以这期就将就着先直接查库实现。
那么问题来了,这 SQL 咋写呢?
直接看简化的表结构:
CREATETABLEorder (
`id`bigintNOTNULL AUTO_INCREMENT,
`order_no`varchar(32) NOTNULLCOMMENT'订单号',
`user_id`bigintNOTNULLCOMMENT'用户id',
`create_time`timestampNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',
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:
SELECTstatistics, count(*) from (
SELECTCASE
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'
ENDasstatistics
from`order`where user_id = 'xxx'
) temp GROUPBYstatistics;
执行结果如下:
思路就是利用 case when 先给对应时间数据打个标记,存放在临时表,然后通过 group by 统计。
我用了一个 4w 多订单数据的用户测试了一下,执行时间是 0.5s ,问题主要出在临时表,一旦数据量起来就不太行,但是暂时没接数仓就先这样顶着了,就前期用用。
突然回想起前公司那时候没招数据同学,让我去整 BI, 那 SQL 写的天花乱坠,感觉把一辈子的 SQL 都写完了,SQL Boy 也不容易啊。
后面我整整把一些骚操作分享一下。
我是yes,从一点点到亿点点,我们下篇见!
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。