时间:2021-07-01 10:21:17 帮助过:31人阅读
之前有朋友提到了这样一个需求,要计算三年中每年都有销售记录的客户量,只有最近两年有销售纪录的客户量(假如某个用户2012年和2014年都有记录,在2013年没有则不计算在内),以及最近一年的新增客户数量。这里大概描述一下我的思路。 Sales表有两个字段Id, Y
之前有朋友提到了这样一个需求,要计算三年中每年都有销售记录的客户量,只有最近两年有销售纪录的客户量(假如某个用户2012年和2014年都有记录,在2013年没有则不计算在内),以及最近一年的新增客户数量。这里大概描述一下我的思路。
Sales表有两个字段Id, Year,要求除上述结果需要Group by Id,然后算Count(DISTINCT Year)的值要等于Min(Year)和Max(Year)的差+1,比如下面关于记录:
Year, Id 2014, 14 2013, 14 2012, 14
Max(Year)是2014,Min(Year)是2012,Count(DISTINCT Year)是3,则这个Id是连续三年都有记录的。下面的记录则是连续两年都有记录的:
2013,12 2014,12
Max(Year)是2014,Min(Year)是2013,Count(DISTINCT Year)是2。下面的记录则是最近一年的新客户:
2014,17
Max(Year)是2014,Min(Year)是2014,Count(DISTINCT Year)是1,。
具体代码是这样的:
//导入数据 Customer: LOAD Year, Id From ../QVD/Customer.csv; //获得最近三年中,每个Id出现的最大年份和最小年份,以及不同Year的数量 Frequency20140609Temp: LOAD Id as Id0609Temp, Min(Year) as MinYear0609Temp, Max(Year) as MaxYear0609Temp, Count(DISTINCT Year) as CountYear0609Temp Resident Customer Where Year>=Year(Now())-2 Group By Id; //取出Id出现的最大年份减去最小年份+1等于该Id出现的不同年份的数量 Frequency20140609: LOAD Id0609Temp as Id0609, MinYear0609Temp as MinYear0609, CountYear0609Temp as CountYear0609 Resident Frequency20140609Temp Where MaxYear0609Temp-MinYear0609Temp + 1 = CountYear0609Temp AND MaxYear0609Temp=Year(Now());//最大年份需要是今年,要不然可能是去年以前连续两年都有销售记录的Id
下面是图表的Dimension,Expression和Chart:
如图所示,最近一年才有记录的是4个Id,连续两年有销售纪录的是2个Id,连续三年有销售纪录的是8个Id。
下面用一些数据测试一下我的结果,首先在Customer.csv中插入如下数据:
2012,18 2013,18 2012,19 2014,19 2013,20 (PS: 上面的这些Id在之前数据源中都不存在,是这次新加的)
按照我现在的逻辑,增加上面Id为18,19,20的记录都不会导致图表发生变化,如下所示:
再增加如下数据,
2014,21 2013,22 2014,22 2012,23 2013,23 2014,23
则上面图表中的三项数据都会+1,如下所示:
各位看官,假如文中有错还望不吝赐教!感谢感谢!