mysql 百分比查询

时间:2022-06-01 23:23:09
CREATE TABLE IF NOT EXISTS `mj_online_day` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cid` int(11) NOT NULL DEFAULT '0',
  `online_time` int(11) NOT NULL DEFAULT '0' COMMENT '在线时长',
  `login_times` int(11) NOT NULL DEFAULT '0' COMMENT '登录次数',
  `lv` smallint(6) NOT NULL DEFAULT '0' COMMENT '当天角色等级',
  `date` date NOT NULL DEFAULT '0000-00-00',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `date` (`date`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='每天各个用户在线信息' AUTO_INCREMENT=86801 ;

--
-- 转存表中的数据 `mj_online_day`
--

INSERT INTO `mj_online_day` (`id`, `cid`, `online_time`, `login_times`, `lv`, `date`) VALUES
(86786, 10001, 279, 1, 40, '2013-02-22'),
(86774, 10025, 15842, 1, 20, '2013-02-24'),
(86784, 100142, 15206, 1, 18, '2013-02-22'),
(86764, 100141, 22616, 2, 18, '2013-02-22'),
(86798, 10014, 10571, 3, 18, '2013-02-22'),
(86777, 10028, 6347, 2, 16, '2013-02-24'),
(86762, 10252, 17435, 1, 12, '2013-04-06'),
(86775, 10026, 2371, 1, 10, '2013-02-24'),
(86699, 10217, 6032, 1, 10, '2013-04-06'),
(86800, 10024, 20, 1, 9, '2013-02-23'),
(86773, 10024, 6910, 1, 9, '2013-02-24'),
(86780, 10008, 1629, 1, 6, '2013-02-23'),
(86793, 10008, 9204, 2, 6, '2013-02-22'),
(86763, 10008, 5557, 2, 6, '2013-02-24'),
(86700, 10273, 482, 1, 5, '2013-04-06'),
(86781, 10009, 6013, 1, 5, '2013-02-23'),
(86696, 10009, 640, 12, 5, '2013-04-06'),
(86794, 10009, 39, 1, 5, '2013-02-22'),
(86785, 10016, 49156, 1, 4, '2013-02-23'),
(86778, 10029, 4315, 1, 4, '2013-02-24');

建表语句如上:
想要查询的结果为:
以date,lv分组  每组的(online_time/login_times)值最大的前30%的数据
请教各位大虾 mysql 百分比查询

6 个解决方案

#1


有么有人?是不是我问题不大清楚?

#2


   建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
   参考一下这个贴子的提问方式 http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
   
   1. 你的 create table xxx .. 语句
   2. 你的 insert into xxx ... 语句
   3. 结果是什么样,(并给以简单的算法描述)
   4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
   
   这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

#3


建表和插入语句 顶楼。。
结果是: 想获得每一天每个等级中(online_time/login_times)30%最大的数据(比如有10个则取3个)的(online_time的和除以login_time的和)
例子:
如果数据为:
date            lv           online_time        login_times
2013-04-04      10             60                    3
2013-04-04      10             80                    3
2013-04-04      10             90                    3
2013-04-04      10             100                   3
2013-04-04      10             80                    2
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
欲得的结果为
date            lv            online_time/login_times      
2013-04-04      10             (90+100+80)/(3+3+2)                 


#4


select date,lv,sum(online_time)/sum(login_times)
from tb A
where 
(select date,count(*)%0.3
from tb
where A.date=B.date and A.lv=B.lv
group by date)>(select count(*) from tb C where A.date=C.date and A.lv=C.lv and and A.online_time<C.online_time )
group by date,lv;

#5


引用 4 楼 rucypli 的回复:
select date,lv,sum(online_time)/sum(login_times)
from tb A
where 
(select date,count(*)%0.3
from tb
where A.date=B.date and A.lv=B.lv
group by date)>(select count(*) from tb C where……

谢谢rucypli。但是还是不对,感觉思路应该是对的,应该还要再变变。
还有么有大虾帮忙的 mysql 百分比查询

#6


要是我就只能写存储过程来解决了,因为count(*)%0.3其实是一个个数,也就是limit条件,要让mj_online_day表按online_time/login_times降序排序,然后个数是count(*)%0.3

#1


有么有人?是不是我问题不大清楚?

#2


   建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
   参考一下这个贴子的提问方式 http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
   
   1. 你的 create table xxx .. 语句
   2. 你的 insert into xxx ... 语句
   3. 结果是什么样,(并给以简单的算法描述)
   4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
   
   这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

#3


建表和插入语句 顶楼。。
结果是: 想获得每一天每个等级中(online_time/login_times)30%最大的数据(比如有10个则取3个)的(online_time的和除以login_time的和)
例子:
如果数据为:
date            lv           online_time        login_times
2013-04-04      10             60                    3
2013-04-04      10             80                    3
2013-04-04      10             90                    3
2013-04-04      10             100                   3
2013-04-04      10             80                    2
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
2013-04-04      10             60                    3
欲得的结果为
date            lv            online_time/login_times      
2013-04-04      10             (90+100+80)/(3+3+2)                 


#4


select date,lv,sum(online_time)/sum(login_times)
from tb A
where 
(select date,count(*)%0.3
from tb
where A.date=B.date and A.lv=B.lv
group by date)>(select count(*) from tb C where A.date=C.date and A.lv=C.lv and and A.online_time<C.online_time )
group by date,lv;

#5


引用 4 楼 rucypli 的回复:
select date,lv,sum(online_time)/sum(login_times)
from tb A
where 
(select date,count(*)%0.3
from tb
where A.date=B.date and A.lv=B.lv
group by date)>(select count(*) from tb C where……

谢谢rucypli。但是还是不对,感觉思路应该是对的,应该还要再变变。
还有么有大虾帮忙的 mysql 百分比查询

#6


要是我就只能写存储过程来解决了,因为count(*)%0.3其实是一个个数,也就是limit条件,要让mj_online_day表按online_time/login_times降序排序,然后个数是count(*)%0.3