sql-SQL 求每月会员流失数量

问题描述

SQL 求每月会员流失数量

一个会员6个月以上没有消费记录,则在该月算做一个流失会员。

一张表,有三个字段 年月(YYYYMM) 会员ID 会员消费日期(YYYYMM)

一个年月有多个会员,一个会员有多个消费日期,同一个会员只有一个年月

最后希望输出这样的结果

年月 该月会员流失数量

求做法。伪代码或者文字描述清楚一点就行。

解决方案

1、建日期辅助表。
2、根据消费表算需要消费截止日期。
3、统计这消费区间内是否有消费记录。
4、根据统计的消费区间记录记录是0,统计当月的流失会员。

以下是mysql的写法
 create table PDetail(
   DateValue varchar(8),
   UserId varchar(20),
   CostValue varchar(8)
);
create table YearMonth(
   DateValue varchar(8)
);
insert into PDetail(DateValue,UserId,CostValue) values('201001','1','201001');
insert into PDetail(DateValue,UserId,CostValue) values('201001','1','201002');
insert into PDetail(DateValue,UserId,CostValue) values('201001','1','201003');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201001');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201002');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201003');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201008');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201101');
insert into PDetail(DateValue,UserId,CostValue) values('201001','2','201105');
insert into PDetail(DateValue,UserId,CostValue) values('201001','3','201001');
insert into PDetail(DateValue,UserId,CostValue) values('201001','3','201002');
insert into PDetail(DateValue,UserId,CostValue) values('201001','3','201003');
insert into PDetail(DateValue,UserId,CostValue) values('201001','4','201001');
insert into PDetail(DateValue,UserId,CostValue) values('201001','4','201002');
insert into PDetail(DateValue,UserId,CostValue) values('201001','4','201007');
insert into PDetail(DateValue,UserId,CostValue) values('201001','5','201008');
insert into PDetail(DateValue,UserId,CostValue) values('201001','5','201009');
insert into PDetail(DateValue,UserId,CostValue) values('201001','5','201010');

insert into YearMonth(DateValue) values('201001');
insert into YearMonth(DateValue) values('201002');
insert into YearMonth(DateValue) values('201003');
insert into YearMonth(DateValue) values('201004');
insert into YearMonth(DateValue) values('201005');
insert into YearMonth(DateValue) values('201006');
insert into YearMonth(DateValue) values('201007');
insert into YearMonth(DateValue) values('201008');
insert into YearMonth(DateValue) values('201009');
insert into YearMonth(DateValue) values('201010');
insert into YearMonth(DateValue) values('201011');
insert into YearMonth(DateValue) values('201012');
insert into YearMonth(DateValue) values('201101');
insert into YearMonth(DateValue) values('201102');
insert into YearMonth(DateValue) values('201103');
insert into YearMonth(DateValue) values('201104');
insert into YearMonth(DateValue) values('201105');
insert into YearMonth(DateValue) values('201106');
insert into YearMonth(DateValue) values('201107');
insert into YearMonth(DateValue) values('201108');
insert into YearMonth(DateValue) values('201109');

SELECT YearMonth.DateValue 年月,IFNULL(CNT,0) 该月会员流失数量 FROM  YearMonth left join  (
SELECT DateValue, count(*) CNT from (
SELECT YearMonth.*,P.UserId from YearMonth left join (
SELECT P.*,(SELECT COUNT(*) FROM PDetail
  WHERE PDetail.UserId=P.UserId
   and PDetail.CostValue>P.CostValue
   and PDetail.CostValue<=P.NeedCostDate) cnt
from (
SELECT P.*,date_format(
DATE_ADD(
   str_to_date(CONCAT(P.CostValue,'01'), '%Y%m%d')
,INTERVAL 6 MONTH)
,'%Y%m') NeedCostDate
 FROM PDetail P
) P
) p ON YearMonth.DateValue = P.NeedCostDate and p.cnt=0
) p where p.userid is not null group by datevalue
) P ON YearMonth.DateValue = P.DateValue ORDER BY 年月

解决方案二:

年月 是个什么作用呢

解决方案三:

查询每个会员消费日期,倒序排列 找第一个 然后和当前日期比较 大于6个月的就算作是

解决方案四:

可以理解为消费记录表中每一段时间(六个月)内,会员是否有记录,统计问题

时间: 2024-11-08 19:08:55

sql-SQL 求每月会员流失数量的相关文章

oracle-帮忙写个SQL脚本求帮忙

问题描述 帮忙写个SQL脚本求帮忙 问题: 以7月为例,北京来访数量为2151条记录,调取2151条 来访主叫号码在1月--7月之间重复2次以上的数据.这个SQL脚本怎么写.有哪位大神可以指点一下.谢谢啦 解决方案 select number,count(*) from table group by number having count(*)>1 解决方案二: select * from table where month=7 group by numberType(主叫) having co

数据-订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品)

问题描述 订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品) 一对多关系的数据比如订单和订单商品,要一起显示订单和其商品信息,怎么样查询最优 就像淘宝一样,每个订单(order表)对应多个商品(order_item表)时,查询订单信息必须把该订单的商品主要信息也显示出来. 解决方案 使用连接进行查询.有订单肯定就有商品了 涉及到三张表订单表订单商品表商品表select * from (select 订单.*订单商品.* from 订单 left join 订单商品 on

数据-sql问题求大神解救哈小弟,感激不尽

问题描述 sql问题求大神解救哈小弟,感激不尽 major A A AB 要查询出来的结果为 major A A A 注:这里数据不是死的,是活的,只是例子.求大神给SQL语句!!! 解决方案 用distinct 解决方案二: 什么意思说清楚点,AB什么含义,是叫我们拆开吗 解决方案三: select distinct major from 表名 where major="A"; 解决方案四: 可以参考这篇文章:http://www.cnblogs.com/maanshancss/ar

oracle sql语句 求sql语句

问题描述 oracle sql语句 求sql语句 数据源: 图片自动说明: 日期,投诉次数,分公司ID,分公司,投诉类别 环比:取查询日期的前一天,如:20150720,环比20150719 结果: 每万用户投诉比 每万用户投诉比环比增幅 个人投诉总次数 个人投诉环比增幅 集团投诉总次数 集团投诉环比增幅 解决方案 oracle sql语句优化Oracle用SQL语句分页 解决方案二: 分公司总用户数都没有,哪里来的每万用户投诉比? 解决方案三: 用decode吧,参考这个sql select

DedeCMS全局标签sql|SQL标签

sql|SQL标签 标签名称:sql功能说明:用于从模板中用一个SQL查询获得其返回内容适用范围:全局使用基本语法:{dede:sql sql=""}底层模板{/dede:sql}参数说明:sql="" 完整的SQL查询语句相关函数:文件\include\taglib\sql.lib.php第6行function lib_sql(&$ctag,&$refObj) 底层模板字段:SQL语句中查出的所有字段都可以用[field:字段名/]来调用应用实例:

微信放宽了服务号的每月推送数量限制

摘要: 近期,微信官方公布了一次重大的策略调整,放宽了服务号的每月推送数量限制,并且对于群发策略也有了很大程度的开放.先来看看官方说法: 1 .为了增强和提升微信公众帐号的服 近期,微信官方公布了一次重大的策略调整,放宽了服务号的每月推送数量限制,并且对于群发策略也有了很大程度的开放.先来看看官方说法: 1.为了增强和提升微信公众帐号的服务能力,所有服务号的群发次数由原来的每月1次改为每月(自然月)4次. 2.对已微信认证的服务号,开放公众平台高级群发接口,开发者可以通过高级群发接口实现更灵活的

时间序列预测教程:如何利用 Python 预测波士顿每月持械抢劫案数量?

Jason Brownlee:时间序列预测法是一个过程,而获得良好预测结果的唯一途径是实践这个过程. 在本教程中,您将了解如何利用Python语言来预测波士顿每月持械抢劫案发生的数量. 本教程所述为您提供了一套处理时间序列预测问题的框架,包括方法步骤和工具,通过实践,可以用它来解决自己遇到的相关问题. 本教程结束之后,您将了解: 如何核查Python环境并准确地定义一个时间序列预测问题. 如何构建一套测试工具链,用于评估模型,开发预测原型.以及如何通过时间序列分析工具更好地理解你的问题. 如何开

大多数智能手机用户每月App下载数量为零

摘要: 大多数智能手机用户每月App下载数量为零 苹果自从2008年推出了iPhone应用程序商店以来,移动应用程序人气和效用暴涨.然而,根据comScore统计数据显示,大多数美国智能手机用户一个典 大多数智能手机用户每月App下载数量为零 苹果自从2008年推出了iPhone应用程序商店以来,移动应用程序人气和效用暴涨.然而,根据comScore统计数据显示,大多数美国智能手机用户一个典型月的应用程序下载数量为零.只有约三分之一的智能手机用户在一个平均月中下载应用程序,下载数量为1-3款应用

SQL语句查询重复字段并按数量排序

  SQL语句 描述:exhibitiononline表主键exhiid, exhibitor表有外键 exhid,对应表 exhibitiononline的主键exhiid; exhibitiononline表---------> 一对多 <------------- exhibitor表 功能:查询出 exhibitiononline表中,exhiid存在于表 exhibitor中的所有数据,并根据 exhibitor表的exhid的数量排序 select * from exhibitio