先说需求

1.0 版本
刚开始是在 评论表 里查找 项目名 和 id不重复

我一开始是通过  group by 实现的
select PROJECT_ID,PROJECT_NAMEfrom COMMENT_MESSAGEwhere DELFLAG = 0group by PROJECT_ID,PROJECT_NAME

2.0 版本

需求增加,要求查询最近的5条记录。 此需求分为两部分。1、只查条5数据。2、按时间排序(最近的5条)首先,我就加了一个 rownum  <= 5 ,然后,我加了createdate字段用来排序

代码如下

select PROJECT_ID,PROJECT_NAME,CREATEDATEfrom COMMENT_MESSAGEwhere DELFLAG = 0and rownum <= 5group by PROJECT_ID,PROJECT_NAME,CREATEDATEorder by  CREATEDATE desc

结果顺利的翻车了。查出来的结果有重复的


这样可用的数据就只有两条了,和需求的5条不符。

我发现出现这样的结果是
因为查询条件里有createdate,
由于createdate是唯一的,所以group by以后原本需要合并的数据无法合并了。
如果把createdate去掉,就没法排序(需求是要求取最近的5条)


为此我实验了好久上网查了许多资料,仍一无法解决问题。

不是结果重复,就是查出来的数据不足5条。

脑壳疼。。。。。

然后在同事的帮助下,用了一个中午,想了一个办法

将查出的数据按 项目id相同的分组排 并序加一个 序号(序号很重要) 再取序号为1的就是既有createdate(可以排序啦~)又唯一的所有数据了然后再处理这部分数据,将数据 order by 一下,
最终取数据的前5条就可以了

代码如下

select * from (select * from (//括号内的就是按 项目id相同的分组排 并序加一个序号SELECT PROJECT_ID,PROJECT_NAME,createdate,Row_Number() OVER (partition by PROJECT_ID ORDER BY createdate desc) rank FROM COMMENT_MESSAGE where PROJECT_NAME like concat(concat('%',''),'%')//这里是因为还有有个模糊搜索的功能)where rank=1 //再取序号为1的就是既有createdate又唯一的所有数据了order by createdate desc//再按时间排序一下)
where rownum <=5//最后只取前5条(oracle数据库)
order by createdate desc//按时间倒序排列一下

至此终于解决 取分组后的按时间倒序的前5条数据了

既兼顾了分组(取相同的数据的唯一一个)又兼顾了按时间(createdate)排序最终取5条数据(不多不少)基本完美。

原本我都打算仅仅group by一下 取出所有分组后的数据,然后在java中将数据遍历一遍处理一下,但是想想这样不好,如果数据量大的话,那处理挺耗时间和资源的。


记录并分享一下,增加经验,供大家参考

SQL:取 分组后 的 按时间倒序 的前5条数据相关推荐

  1. mysql分组取出每组地一条数据_MySQL 分组后取每组前N条数据

    与oracle的rownumber() over(partition by xxxorder by xxx)语句类似,即:对表分组后排序 创建测试emp表 DROP TABLE IF EXISTS e ...

  2. mysql查询数据分组后保留每组前n条数据

    最近做项目遇到一个这样需求的sql语句,根据一系列的条件后,分组查询出来的数据是这样的 可以看到用户id=4 的有三条数据,用户id=1的有两条数据. 我需求是相同的用户id只取最多两条数据,也就如下 ...

  3. mysql 分组内取前几条数据

    项目中很常见的一个需求就是取出每个种类的前n条数据,这是我们通常想到分组(group by),但是group by后伴随着数据的聚合 每个种类只保留了一条数据,这并不满足我们的需求取前n条数据,这时候 ...

  4. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据. 好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的 ...

  5. oracle数据库取前几行,Oracle数据库实现获取前几条数据的方法

    如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟! 1.在Oracle中实现SELECT TOP N : 由于 ...

  6. 茴香豆的n种写法之②——Sql据多个条件 查询每个条件的前N条记录

    --------------------------------- -- Author: liangCK 小梁 -- Title : 查每个分组前N条记录 -- Date : 2008-11-13 1 ...

  7. Lambda表达式 Linq SQL Server 分组后获取第一条数据或最小(最大)数据

    1.Lambda表达式 以下是从网上粘贴下来  经测试失败 提示方法"First"只能用作最终查询操作.请考虑在这个实例中使用方法"FirstOrDefault" ...

  8. stream实现list根据对象中多个属性分组,并取分组后最新数据

    业务场景:定时任务同步中间表数据到业务表,如果中间表中存在相同维度的多条数据(未创建唯一索引),取最新一条数据,并对查询的中间表数据进行更新. 方式1 // 根据结果表唯一索引分组,取中间表重复最新一 ...

  9. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

  10. 图解SQL 004 拼多多面试题:如何查找前 20% 的数据?

    [题目] 用户访问次数表,列名包括用户编号.用户类型.访问量.要求在剔除访问次数前 20% 的用户后,每类用户的平均访问次数.(拼多多.网易面试题) [解题思路] 使用逻辑树分析方法可以把这个复杂的问 ...

最新文章

  1. 高阶程序员之路-轻松学习分布式锁
  2. hive olap 数据仓库_数据仓库那些事儿
  3. winform频繁刷新导致界面闪烁解决方法
  4. 没用上5G的One World演唱会,视频会议软件Zoom和思科WebEX立功了
  5. ncurses面板库:new_panel(),doupdate(),show_panel(),hide_panel(),move_panel(),del_panel()...
  6. Liunx CentOS6编译安装LAMP
  7. 二维码扫描开源库ZXing定制化【转】
  8. struts2的json插件配置详解
  9. canvas 从ondraw中获取_C# 在PDF中绘制多样风格的文本
  10. 如何安装uclient_UClient官方版下载_UClient手机官方版下载v2.0.0.1580_3DM单机
  11. html 模糊匹配,CSS 属性选择器 模糊匹配的使用
  12. 【python】短信验证之腾讯云短信验证详细步骤
  13. catalina java opts_CATALINA_OPTS与JAVA_OPTS – 有什么区别?
  14. 注销不想用的Apple ID
  15. DELL服务器 R740的风扇设置
  16. Java通过axis调用WebService
  17. Snipaste - 截图贴图软件
  18. iPhone/iPad/iTouch配置Bash/C/C++/OC/Java/Theos/MySQL/Python开发环境! 让我告诉你iOS的魅力~
  19. Fluent离散相模型分析操作简单实例
  20. 小型微型计算机系统期刊格式,小型微型计算机系统杂志是核心期刊吗?

热门文章

  1. 基于图书管理系统的需求分析之可行性分析安全需求分析系统需求分析
  2. Java成员方法getinfo_Java Swagger.getInfo方法代码示例
  3. hbuilder版本更新失败_Hbuilder X升级后报错误:plus.device.getInfo is not a function
  4. 人工智能-马尔可夫模型
  5. ​Debug如何引流(降龙十八掌)
  6. 如何在 Android 中减小 APK 大小?
  7. Alfa: 1 vulnhub walkthrough
  8. 全球光伏多晶硅价格上涨 中美贸易纠纷不断
  9. 新概念英语(第三册,新版)学习(原文及全文翻译)
  10. 跑步c语言,小程序 跑步 记录跑步代码 记时间和位置更新