MySQL在按照某个字段分组、排序加序号

在MySQL中,为了统计每个人第一次和第二次购买的时间间隔,并按间隔计数求中位数,需要处理订单表数据。通过创建中间表存储关键字段,包括购买人id、下单时间和购买次数。在新订单到来时更新此表,使用SQL更新统计表中的购买次数。当需要按照商品系列查询时,创建临时表进行分组和排序。最终,通过调整SQL语句,实现按时间排序并避免重复次数,确保统计准确性。对购买人id和下单时间建立索引以提高查询效率。
摘要由CSDN通过智能技术生成

事情是这样的,最近领导给了一个新的需求,要求在一张订单表中统计每个人第一次和第二次购买的时间间隔,最后还需要按照间隔统计计数,求出中位数等数据。

  • 由于MySQL不想Oracle那般支持行号、中位数等,所以怎么在表中统计处数据成为了关键

订单表结构,主要包含字段如下

  • id、订单号、购买人id、下单时间、商品信息字段、购买人信息字段等

1.为了方便后续统计,我的想法是构建了一张中间表,只存储一些关键字段,如购买人id,下单时间,订单号,以及购买的第几次,结构如下图:
在这里插入图片描述

字段解释:fans_id:购买人id、order_time:下单时间、tid:订单号、series:商品系列、shop:店铺、times:第几次购买、sync_time:同步时间、effective:是否有效、failure_time:失效时间

2.写了一段代码,处理历史订单,把所有数据按照表中格式添加进去,方便统计,每次新订单进来时,更新一下这个表即可。

3.统计:

-- 统计购买次数最大和最小
select max(times) from 统计表 where effective = '有效'
-- 统计最大购买次数间隔、最小间隔以及平均间隔(中位数的话,由于MySQL没有中位数函数,所以可以利用子查询的SQL通过程序代码计算)
SELECT
    max(date) as max,
    min(date) as min,
    sum( date * mans ) / count( mans ) as avg
FROM
    (
    SELECT
        ifnull(datediff( a.order_time, ( SELECT order_time FROM  统计表 WHERE times = 次数1 AND effective = '有效' AND a.fans_id = fans_id ) ),0) AS 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值