mysql 百分比查询

dxlqiu 2013-04-16 10:38: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%的数据
请教各位大虾
...全文
198 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxlqiu 2013-04-16
  • 打赏
  • 举报
回复
建表和插入语句 顶楼。。 结果是: 想获得每一天每个等级中(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)
ACMAIN_CHM 2013-04-16
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式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) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
dxlqiu 2013-04-16
  • 打赏
  • 举报
回复
有么有人?是不是我问题不大清楚?
hithink 2013-04-16
  • 打赏
  • 举报
回复
要是我就只能写存储过程来解决了,因为count(*)%0.3其实是一个个数,也就是limit条件,要让mj_online_day表按online_time/login_times降序排序,然后个数是count(*)%0.3
dxlqiu 2013-04-16
  • 打赏
  • 举报
回复
引用 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。但是还是不对,感觉思路应该是对的,应该还要再变变。 还有么有大虾帮忙的
rucypli 2013-04-16
  • 打赏
  • 举报
回复
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;

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧