DB2 分组后提取前5条数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2 分组后提取前5条数据相关的知识,希望对你有一定的参考价值。
db2 要查询一张表中的数据,需要分组、按时间排序、count重复的等,如下:
用户打卡记录表:
用户ID 打卡地点ID 打卡时间
1001 20331 2010-10-31 08:01:53
1002 20331 2010-10-31 08:11:23
1001 20331 2010-10-31 18:00:11
1002 10807 2010-10-31 18:09:57
1003 20331 2010-10-31 08:00:01
类似这样很多的数据,很多的用户,很多的打卡地点和不同的打卡时间。
我现在要提取每个用户前5次的打卡次数,什么样的解决思路?sql语句怎样写?
已经解决了,解决思路如下:
1:获取用户最小时间的次数,按照用户分组。
select 用户ID, 打卡地点ID, count(1) num, min(打卡时间) time from TABLE group by 用户ID, 打卡地点ID;
2:通过第1步出来就得知一个用户在不同打卡地点的次数,接着对第1步进行排序:
select *, row_number() over(partition by 用户ID order by time) rank_num from 第一步;
3:接着取第2步排序<=5的用户之和就是最终数据:
select 用户ID, sum(num) total_num from 第2步 where rank_num<=5 group by 用户ID;
下面通过一个SQL语句如下:
select 用户ID, sum(num) total_num from
(select a.*, row_number() over(partition by a.用户ID order by a.time) rank_num from
(select 用户ID, 打卡地点ID, count(1) num, min(打卡时间) time from TABLE group by 用户ID, 打卡地点ID) a ) b where b.rank_num<=5 group by 用户ID;
使用OLAP函数就能解决问题啦:
select * from (
select
(row_number() over (partition by 用户ID order by 打卡时间 asc)) AS row_id
用户ID,
打卡地点ID,
打卡时间
from table_name) t
where row_id<=5 参考技术A 只能用存储过程
思路如下
将分组那个字段比如是A
Create temp table tmp_b
foreach
select distinct A into bianlianga from table
insert into tmp_b
select top 2 B from table where A=bianlianga order by B ;
delete from table where A=bianlianga and B in(select * from tmp_b);
end foreach 参考技术B 问题不太明确,假设是对每个用户查找首次刷卡时间排前五位的地点和总共刷卡次数。
假设你的表中有3个字段UID、PID和TIME,其中TIME是DB2中的TIMESTAMP类型。
首先,创建视图:
db2 => create view v0(uid,pid,time,count) as select uid,pid,min(time),count(*) from test group by uid,pid
结果是每一用户、每一地点的最早刷卡时间和刷卡次数。
然后,执行:
db2 => create view v1(uid,time) as select uid,min(time) from v0 group by uid
这是每个用户首次刷卡记录。注意到一张卡不可能同时在两个地点刷,每个用户都不会出现同样时间的两个首次刷卡记录。
再后,执行:
db2 => create view v2(uid,time) as select uid,time from v0 except select * from
v1
v2中去处了首次刷卡地点。
以下重复:
db2 => create view v3(uid,time) as select uid,time from v2 except select uid,min
(time) from v2 group by uid
去掉了第2次刷卡地点,做够五次后,如果有些地点不够五次,也没关系。这个极其容易,我不一一做了。
下面从v0中减去去掉了五次的集合:
db2 => create view v4 as select v0.uid,v0.pid,v0.time,v0.count from v0,v3 where
v0.uid=v3.uid and v0.time=v3.time
先创建前五个地点以后的完整记录集合。最后,一个减运算:
db2 => create view v5 as select * from v0 except select * from v4
OK!
mysql关联表分组查询多条数据
表:relation
字段:parentCode,childCode,chr_type
表:info
字段:str_catchNum_K,str_fileTopic,str_infoContent,index_num,dt_webdate
这两张关联表进行查询,根据relation表parentCode进行分组,查询relation表的parentCode与info的所有字段,根据dt_webdate进行排序获取前8条数据
其中relation表childCode等于info表中的str_catchNum_k
请大神帮忙!这样的语句该如何写
根据relation表parentCode进行分组,获取每个分组下的,根据dt_webdate进行排序的前8条数据
SELECT a. parentCode,b.* FROM relation a
INNER JOIN info b ON b.str_catchNum_k=a.childCode
GROUP BY a.parentCode
ORDER BY b.dt_webdate
LIMIT 8 ;
追问
你这个数据只能查到8条数据吧。可能是我没说清楚,这个需求是获取所有分组,以及每个分组下的8条数据。感谢仁兄支持
以上是关于DB2 分组后提取前5条数据的主要内容,如果未能解决你的问题,请参考以下文章
求解:db2数据库表Tab中无id,且数据量较大,如何指定查询中间十条数据,不是前十条,谢了。