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%的数据
请教各位大虾
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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
参考一下这个贴子的提问方式 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)
结果是: 想获得每一天每个等级中(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;
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
谢谢rucypli。但是还是不对,感觉思路应该是对的,应该还要再变变。
还有么有大虾帮忙的
#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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
参考一下这个贴子的提问方式 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)
结果是: 想获得每一天每个等级中(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;
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
谢谢rucypli。但是还是不对,感觉思路应该是对的,应该还要再变变。
还有么有大虾帮忙的
#6
要是我就只能写存储过程来解决了,因为count(*)%0.3其实是一个个数,也就是limit条件,要让mj_online_day表按online_time/login_times降序排序,然后个数是count(*)%0.3