【Sql】根据字段分组排序,取其第一条数据

这篇具有很好参考价值的文章主要介绍了【Sql】根据字段分组排序,取其第一条数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【一】问题描述

(1)问题描述
有时候我们需要对数据进行去重处理,例如查询结果里的文件名有重复,我们希望可以按照创建时间排序,最终结果里每个文件名只取创建时间最近的一个。

(2)有哪些问题
想到去重,可以想到使用distinct或者group by分组。但是这两者有个问题,例如我们查询结果中包含多个目标字段【文件id,文件名,文件所属项目,文件创建时间,文件类型】等等。

distinct是对组合进行去重,必须加在select中和所有目标字段之前,也就是只有当上面的5个字段都重复了,这条数据才算是重复。

group by也是要求select中的字段必须出现在group by中,同样是上面的5个字段都重复了,这条数据才算是重复。

而我们的目标是只根据【文件名】进行分组,在分组中根据文件创建时间进行排序,然后每组中只选取创建时间最近的那条数据,且这条数据是完整的包含上面5个字段。

(3)为什么不在业务代码里进行过滤处理?
因为还有分页查询的功能,所以查询的工作就必须得在sql里实现(就当学习sql了)

【二】解决方案(oracle和mysql都可用)

(1)当前sql

SELECT
	T.ID,
	R.TASK_ID,
	T.CRT_DT_TM,
	'RST_TABLE' AS TYPE,
	T.FULL_NM AS NAME 
FROM
	period_script_x_rst_table T
	JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
	JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID 
WHERE
	S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID 

查询结果
sql 分组取第一条数据,sql,数据库,mysql
可以看到NAME有很多重复的,我们只想取到时间最近的那一条,同时还不能用group by进行分组

(2)加上分组语句和组内排序

SELECT
	T.ID,
	R.TASK_ID,
	'RST_TABLE' AS TYPE,
	T.FULL_NM AS NAME,
	rank () over ( partition BY T.FULL_NM ORDER BY T.CRT_DT_TM DESC ) rankNo 
FROM
	period_script_x_rst_table T
	JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
	JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID 
WHERE
	S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID

查询结果
sql 分组取第一条数据,sql,数据库,mysql
可以看到结果是根据NAME进行了分组,并且进行了组内排序,最后给每条数据加了一个组内排序序号。

(3)加上条件过滤实现组内取第一条目标数据

SELECT
	* 
FROM
	(
	SELECT
		T.ID,
		R.TASK_ID,
		T.CRT_DT_TM,
		'RST_TABLE' AS TYPE,
		T.FULL_NM AS NAME,
		rank () over ( partition BY T.FULL_NM ORDER BY T.CRT_DT_TM DESC ) rankNo 
	FROM
		period_script_x_rst_table T
		JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
		JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID 
	WHERE
		S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID 
	) e 
WHERE
	e.rankNo = 1 

查询结果
sql 分组取第一条数据,sql,数据库,mysql
可以看到,根据组内排序序号rankNo=1来过滤,就实现了去重的效果

【三】总结

如果想要实现去重,而distinct和group by都无法满足需求,就可以考虑试试这个方案文章来源地址https://www.toymoban.com/news/detail-570810.html

rank() over(partition by e.commandid order by e.systemid desc) rankNo (
partition by 根据什么进行分组,
order by 根据什么进行排序,
rank() over() 进行排名
rankNo 别名
)

到了这里,关于【Sql】根据字段分组排序,取其第一条数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES】分组后每组取第一条

    表格如下: 想要获得所有测站最新的一条数据,即先对Station分组,根据time进行排序(降序),取第一条。 参考文章: 分组后进行排序取第一条,然后再过滤 - Elastic 中文社区

    2024年02月15日
    浏览(78)
  • Java查询es数据,根据指定id检索(in查询),sql权限过滤,多字段匹配检索,数据排序

    Java集成Elasticsearch,进行索引数据查询,并进行sql权限过滤,指定id检索(in查询),多字段匹配检索,数据排序。由于权限过滤是根据sql语句判断当前用户或其部门可查询的数据,所以采用以下方法: 1.通过sql过滤出当前用户可查询的数据id集合idsList; 2.将当前用户可查询的

    2024年02月22日
    浏览(66)
  • Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算

           笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。       首先我们假设一个Clickhouse数据表: 这个表格的字段含义如注释,

    2024年02月14日
    浏览(42)
  • Sql group by 分组取时间最新的一条数据

    1.取时间最新的记录 不分组有重复(多条CreateTime一样的都是最新记录) 2.分组后取时间最新的记录 3.如果Id是uuid类型无法使用max(id)的解决办法(使用开窗函数)

    2024年02月11日
    浏览(51)
  • golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重

    需求: 索引:dna 需求:根据app.Id分组,统计每组的OwnerBid数量,过滤空值并去重 dna索引结构 es查询语句 es查询结果 goalng实现 models.EsCountAgg 【面向校招】全力备战2023Golang实习与校招 欢迎进群交流:1007576722

    2024年02月17日
    浏览(46)
  • Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)

    有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个 先根据appId分组,然后根据versionSort取最大. JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。 取list中对象的某个属性作为唯一key,对象作为value形成一个map集合,能

    2024年02月16日
    浏览(57)
  • sql 分组讨论,二级分组(非2个字段分组),使用 窗口函数和普通分组实现

    先按照一个字段分组,在按照 第二个字段分组。 之后,如果 这个 二级分组中的数据,是 1条的。就筛选出来。 比如: 先按照 站点分组,再按照 设备分组, 即:如果站点上配置了2个设备。就筛选出来。 然后:这2个设备 都必须是屏幕 查出配置了2个设备的站点 要求 这两个

    2024年02月13日
    浏览(36)
  • SQL结果-根据某个字段取最新时间去重

    现在有个sql,如果“propertyId”相同,取“updateTime”时间最新的那条记录,其他过滤掉。 结果SQL 为了通过 propertyId 去重并获取每个 propertyId 对应的最新时间的记录,可以使用窗口函数 ROW_NUMBER() 来对每个分组进行排序,并在外部查询中取出 rn 列等于 1 的行,即每个分组中的第

    2024年02月07日
    浏览(58)
  • 【MySQL】根据多个字段查询数据进行去重的sql编写

    一、实现思路 根据四个字段进行数据去重的SQL编写可以使用GROUP BY和HAVING子句来实现。 场景一: 假设有一个名为 table1 的数据表,其中包含四个字段: field1 、 field2 、 field3 和 field4 。要求根据这四个字段进行数据去重。 可以使用以下SQL语句: 场景二: 上述SQL语句会返回所

    2024年02月15日
    浏览(55)
  • SQL基础语法 | 增删改查、分组、排序、limit

    创建数据库 查看数据库 选择数据库 删除数据库 创建表格 删除表格 创建schema模式 删除schema模式 删除一个空模式 删除一个模式及包含的所有对象 1. 增insert into sql语法 : INSERT INTO TABLE_NAME (字段名1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN) 2. 查询select SQL语法:

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包