mysql 累加排序求名次
自己做的一个小项目里需要用mysql计算一些信息。
mysql中的 表如下(注:表中数据都是测试数据,随机生成的)
- mysql> select * from shake_log;
- +-----+-------------+--------+---------------------+------+
- | id | mobile | credit | time | type |
- +-----+-------------+--------+---------------------+------+
- | | | 1.3 | -- :: | |
- | | | 0.3 | -- :: | |
- | | | 0.3 | -- :: | |
- | | | 0.2 | -- :: | |
- | | | 0.5 | -- :: | |
- 。。。。。。
- 。。。。。。
- | | | 0.5 | -- :: | |
- | | | 0.2 | -- :: | |
- | | | 0.2 | -- :: | |
- | | | 0.3 | -- :: | |
- 。。。。。。
- 。。。。。。
这张表的含义是这样的,每一条记录代表一次获益,而每个mobile的获益就是当天所有的记录的累加和。
例如上面的记录18369905226有三条记录,那么他今天的获益就是 0.5+0.2+0.2+0.3 = 1.2
1. 求获益最多的mobile和值
- select mobile, sum(credit) as sumCredit from shake_log where time between '2014-12-06 00:00:00' and '2014-12-06 23:59:59' group by mobile order by sumCredit desc limit 1;
修改成hql语句,在java中如下:
- public CreditRank queryRank(int year, int month, int day) {
- String hql = "select mobile, sum(credit) as sumCredit, time from CreditLog"
- + " where year(time) = ? and month(time) = ? and day(time) = ?"
- + " group by mobile order by sumCredit desc";
- Query query = currentSession().createQuery(hql);
- query.setFirstResult(0);
- query.setMaxResults(1);
- query.setParameter(0, year);
- query.setParameter(1, month);
- query.setParameter(2, day);
- List<Object[]> objsList = query.list();
- Object[] firstObjs = objsList.get(0);
- return new CreditRank(1, (String)firstObjs[0], (Double)firstObjs[1]);
- }
2. 求某一具体的mobile按总获益算得的名次
- select rank from (select @counter:=@counter+1 as rank, mobile, sumCredit from (select mobile, sum(credit) as sumCredit from shake_log where time between '2014-12-06 00:00:00' and '2014-12-06 23:59:59' group by mobile order by sumCredit desc) as sumList, (select @counter:=0) as t) as rankList where mobile='';
这一部分没有转成hql, 因为hibernate不支持from子查询。
那就使用hibernate直接调用sql语句。
- public CreditRank queryRank(String mobile, int year, int month, int day) {
- String sql = "select rank, mobile, sumCredit " +
- "from (select @counter\\:=@counter+1 as rank, mobile, sumCredit " +
- "from (select mobile, sum(credit) as sumCredit from shake_log " +
- " where year(time) = :year and month(time) = :month and day(time) = :day " +
- "group by mobile order by sumCredit desc) as sumList, (select @counter\\:=0) as t) as rankList " +
- "where mobile = :mobile";
- SQLQuery query = currentSession().createSQLQuery(sql)
- .addScalar("rank", StandardBasicTypes.INTEGER)
- .addScalar("mobile", StandardBasicTypes.STRING)
- .addScalar("sumCredit", StandardBasicTypes.DOUBLE);
- // 设置参数
- query.setParameter("year", year);
- query.setParameter("month", month);
- query.setParameter("day", day);
- query.setParameter("mobile", mobile);
- // 查询
- List<Object[]> objsList = query.list();
- if (objsList.size() == 0) {
- return null;
- }
- Object[] firstObjs = objsList.get(0);
- // 封装
- CreditRank creditRank = new CreditRank((Integer)firstObjs[0], (String)firstObjs[1], (Double)firstObjs[2]);
- return creditRank;
- }
需要注意:
:= 要 \\:= 才能被识别
mysql 累加排序求名次的更多相关文章
- 【MySQL】排序原理与案例分析
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...
- POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)
题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...
- mysql 自定义排序顺序
mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...
- SQL Server 与MySQL中排序规则与字符集相关知识的一点总结
字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...
- MySql获取记录的名次
在oracle中有rownum之类的东西表示记录的名次,那么在MySql中怎么获取名次呢? as rank ) B 获取的rank就是名次了 user_id rank 134762 122139 ...
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...
- MySQL分组排序(取第一或最后)
MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...
- MySQL的排序(order by)
MySQL的排序(order by) 1.降序(DESC) 2.升序(ASC) 1. 降序(DESC) 完整代码: SELECT `学号`,`考试日期`,`考试成绩` FROM `表2`ORDER B ...
- mysql order排序
使用order by 可以对结果进行排序, 默认情况下,order by 以升序进行排序,因此ASC 子句是可选的. DESC 是降序排列. 升序 select * from emp where d ...
随机推荐
- Base64的Java代码实现
欢迎拍砖~ 在数据二进制和byte互相转换的地方方法写得有点挫,不知道有没有更好的方法~ 顺便复习了java的一些基础东西,如位操作,原码反码补码 可以在这篇blog里学习到详细的知识点:http:/ ...
- ui-router的使用
使用时需要ui中用ui-view指令指定 如: <div ui-view></div> 首先配置注册 ui-route var mainModule = angular.mod ...
- CenOs安装中文输入法
http://jingyan.baidu.com/album/d8072ac4434666ec95cefda1.html?picindex=2 查看链接
- CI框架篇之控制器篇--设置路由(1)
CodeIgniter 定义默认控制器 当你的网站不存在某个URI 或者 用户直接从根目录访问的时候,CodeIgniter 会加载默认控制器. 打开 application/config/route ...
- struts通过Ajax返回数据时,例如对象类型,没有执行Ajax的回调函数
<result type="json" name="success"> <param name=" ...
- java开发规范总结_代码注释规范
规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.基本规则 1.注释应该使代码更加清晰易懂 2.注释要简单明了,只要提供能够明确理解程序所必要的信息就可以了.如果注释太复杂说明程序需要修改调 ...
- 【转】iOS开发常用的第三方类库
原文: http://blog.csdn.net/xiazailushang/article/details/9716043 在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使 ...
- YII 数据库相关操作
CDbConnection: 一个抽象数据库连接CDbCommand: SQL statementCDbDataReader: 匹配结果集的一行记录CDbTransaction:数据库事务 访问数据库 ...
- C#后台程序与HTML页面中JS方法互调
此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...
- css3多行省略号
-webkit-line-clamp 概述: -webkit-line-clamp 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中. ...