mysql 累加排序求名次

自己做的一个小项目里需要用mysql计算一些信息。

mysql中的 表如下(注:表中数据都是测试数据,随机生成的)

mysql> select * from shake_log;
+-----+-------------+--------+---------------------+------+
| id  | mobile      | credit | time                | type |
+-----+-------------+--------+---------------------+------+
|   1 | 15963097349 |    1.3 | 2014-12-06 21:00:02 |    2 |
|   2 | 18353367706 |    0.3 | 2014-12-06 21:00:05 |    2 |
|   3 | 18369902586 |    0.3 | 2014-12-06 21:00:08 |    2 |
|   4 | 18369905573 |    0.2 | 2014-12-06 21:00:10 |    2 |
|   5 | 18369905170 |    0.5 | 2014-12-06 21:00:13 |    2 |
。。。。。。
。。。。。。
| 125 | 18369905226 |    0.5 | 2014-12-07 05:00:00 |    1 |
| 126 | 18369905226 |    0.2 | 2014-12-07 05:00:02 |    0 |
| 127 | 18369905226 |    0.2 | 2014-12-07 05:00:04 |    0 |
| 128 | 18369905226 |    0.3 | 2014-12-07 05:00:08 |    0 |
。。。。。。
。。。。。。

这张表的含义是这样的,每一条记录代表一次获益,而每个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;

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=‘18369905136‘;
时间: 2024-12-20 01:09:06

mysql 累加排序求名次的相关文章

poj2299--归并排序求逆序数

/** \brief poj2299  *  * \param date 2014/8/5  * \param state AC  * \return memory 4640K time 3250ms  *  */ #include <iostream> #include <fstream> #include <cstdio> #include <cstring> using namespace std; const int MAXN=500000; int

POJ 2388 Who&#39;s in the Middle(水~奇数个数排序求中位数)

题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: 1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)!=EOF) 8 { 9 int na[n+1]; 10 for(int i=0; i

MySql 分组排序取时间最大的一条记录

SELECT A.* FROM digital_asset A, (SELECT name, max(last_updated) max_day FROM digital_asset GROUP BY name) B WHERE A.name = B.name AND A.last_updated = B.max_day SELECT A . * FROM bbs_threads A, ( SELECT digest, max( dateline ) max_dateline FROM bbs_

【MySQL】排序原理与案例分析

前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序.本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部原理,并介绍与排序相关的参数,最后会给出几个"奇怪"排序例子,来谈谈排序一致性问题,并说明产生现象的本质原因. 排序优化与索引使用 为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索

MySql获取记录的名次

在oracle中有rownum之类的东西表示记录的名次,那么在MySql中怎么获取名次呢? select user_id,@rank:=@rank+1 as rank from t_nouser_static_prototype p,(SELECT @rank:=0) B 获取的rank就是名次了 user_id rank 134762    122139    222140    322141    4

LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到,在for (auto p: prerequistites)中特判了输入中可能出现的平行边或自环. 代码: class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { // [0, {1, 2, 3}], me

MySql之排序规则问题(2)

今天看到这个Sql语句,之前听说过,但是并未弄懂,因此在此特意做下笔记: userName varchar(20) collate chinese_prc_ci_as null 1.首先,collate是一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则投影 ::={windows_collation_name}|{sql_collation_name} 参数:collate_name是应用于表达式列定义或数据库定义的排序规则的名称collation_name

mysql 自定义排序顺序

实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID AS VOUCHER1_0_, tsdvoucher0_.COMMENT_DEVICE_TYPE AS COMMENT2_0_, tsdvoucher0_.COMMENT_ID AS COMMENT3_0_, tsdvoucher0_.COMMENT_PERSON_NO AS COMMENT4_0_, tsdvoucher0_

MYSQL VARCHAR排序 CAST ,CONVERT函数 类型转换

自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为integer(2)的,但是今天在后台发现排序有问题,varchar排序有问题,所以该怎么解决呢? 示例表结构: 先来看一下,我的表结构 show create table cardserver \G *************************** 1. row *************************** Table: cardserver Create Table: CREATE TABLE `card