每日数据统计排序

每日数据统计排序

因为最近在做统计昨日数据并排序的需求,挣扎完成后写博客记录。方便自己以后查询和帮助正在做的小伙伴们

每个人的业务场景不同,先介绍我的场景:

每下载一个app;我们可以得到该app所带来的利润revenue。现在需求是统计昨日下载的app中,那些带来的利润最多的几个,也就是给它们排序


对应的表结构

Campaign表:字段(只介绍用到的)有:id , name , revenue

下载记录表userAction:字段有:id ,下载激活的时间 activeTime ,Campaign


刚开始没用大脑随便写了一个,虽然完成了需求但查询排序用到了两个sql语句,考虑mysql延时和量大的问题。我打算要一个sql解决,于是踏上了不归之路。


sql代码,也是最核心代码:仅供参考

// 统计每天Campaign排名
  @Query("select action.campaign from UserAction action where action.activeTime >= ?1 and action.activeTime <= ?2 group by action.campaign.id order by (count(action.id) * action.campaign.revenue) desc")
  List<Campaign> dailyTopCampaign(Date start , Date end);


因为空格的问题出现了 JPA-style positional param was not an integral ordinal 大家自己多注意下

1.因为group by 不能和limit同时使用,所以在查询后自己限定数量;

2.使用group by 把相同id的Campaign 放在一个组中,其UserAction的id数量便是组的个数,乘以对应的revenue便是我们想要的最大利润;

3.order by 排序 desc 降序;


时间问题,如何设置前一天:

java的日历(百度Calendar可以知道更多知识):

因为激活的时间是有年月日时分秒,所以不能简单的用new Date() - 1的方法完成。

//前日0点
	private static Date getLastDay(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_MONTH, -1);// 前一天
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}

// 每日0点前1毫秒
	private static Date getNowDay(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return DateUtils.addMilliseconds(cal.getTime(), -1);
	}


业务层:
public void topCampaginMessage(){
	Date beginTime = getLastDay(new Date());
	Date endTime = getNowDay(new Date());
	// 获取昨天激活的
List<Campaign> topCampaign = useractionDao.dailyTopCampaign(beginTime, endTime);

个人主页:http://www.itit123.cn/ 更多干货等你来拿


以上是笔者在业务中遇到的情景,不一定满足所有,仅供参考,如有不懂和建议可以留言。博客原文来源:http://blog.csdn.net/qq_19558705 转载请注明来源

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值