如果是每个分类取最新一条是比较简单的,用max配合group就可以搞定;

SQL:获取每个用户最新的一条数据记录_王世洪的博客-CSDN博客_sql取最新的一条数据

但是,如果是取N条的话,不同数据库的做法不一样。

Oracel和MSsql可以用自带函数如row_number()、rowid可以解决,比较方便,如下:

select * from (
select *,row_number() over(PARTITION by c_prov order by c_publish_date) as rowid 
from spiderdata_virus_prov_status
) a where rowid<=10

在Mysql中,没有这么便利的函数,查询了网上别人的处理方式,也测试了但是没有一个成功(可能我菜,试了好几种都没成功,等试成功再更新出来),所以自己就用了一般思路:生成序号的方式,获取10条数据;

(鉴于Mysql也没有with的用法,所以写起来有点废话,亲测:十万级别效率1s-2s,百万级别效率10s吧)

select  s_full.* from 
(
select (@s:=@s+1) as s_noid,virus.* from  spiderdata_virus_prov_status virus,(select @s:=0) s_table 
order by c_prov,c_publish_date
) s_full
inner join 
(
-- 按日期降序并获取最大的序号
select max(i_noid) i_noid,c_prov from (
select (@i:=@i+1) as i_noid,virus.* from  spiderdata_virus_prov_status virus,(select @i:=0) i_table 
order by c_prov,c_publish_date
) source 
group by c_prov)  i_full
on s_full.c_prov=i_full.c_prov
-- 取10条,可以自定义
and s_full.s_noid>i_full.i_noid-10
order by s_full.c_prov,s_full.c_publish_date desc

通过如上,就可以完成Oracle、MSsql、Mysql中,实现每个分类下取N条(最新)数据的功能。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐