oracle 根据部分字段去重

ORACLE 专栏收录该内容
2 篇文章 0 订阅
问题:在oracle中使用group by分组,group by子句中必须包含所有的select中的字段和order by子句中的字段。

在不使用group by子句的情况下,进行分组。(根据部分字段分组)

over()分析函数

原sql

        SELECT
			IM. ID mediaGroupId,
			IC. ID cardId,
			IC.CARD_CONTENT,
			IC.CARD_TITLE,
			IM.UPDATE_TIME mediaUpdateTime,
			IP.SM_URL cardImgUrl,
			ICB.BUTTON_NAME
		
		FROM
			INFO_MEDIA IM
		LEFT JOIN INFO_CARD IC ON IM. ID = IC.MEDIA_ID
		LEFT JOIN INFO_CARD_BUTTON ICB ON IC. ID = ICB.CARD_ID
		LEFT JOIN INFO_PIC IP ON IP. ID = IC.MEDIA_PIC_ID
		WHERE
			IM. ID = '1'
		ORDER BY
			IM.UPDATE_TIME DESC

在这里插入图片描述

我需要根据cardId字段去重,但是看结果还是有重复的。如果使用group by子句的话,是 无法去重 的。因为button_name字段值是不同的,oracle还是会认为两条记录不重复。

改进sql

    SELECT
	    *
    FROM
	(
		SELECT
			IM. ID mediaGroupId,
			IC. ID cardId,
			IC.CARD_CONTENT,
			IC.CARD_TITLE,
			IM.UPDATE_TIME mediaUpdateTime,
			IP.SM_URL cardImgUrl,
			ICB.BUTTON_NAME,
			ROW_NUMBER() OVER (PARTITION BY IC. ID ORDER BY IM.UPDATE_TIME) AS ROW_NUM
		FROM
			INFO_MEDIA IM
		LEFT JOIN INFO_CARD IC ON IM. ID = IC.MEDIA_ID
		LEFT JOIN INFO_CARD_BUTTON ICB ON IC. ID = ICB.CARD_ID
		LEFT JOIN INFO_PIC IP ON IP. ID = IC.MEDIA_PIC_ID
		WHERE
			IM. ID = '1'
		ORDER BY
			IM.UPDATE_TIME DESC
	) T3
    WHERE T3.ROW_NUM = 1

在这里插入图片描述

可以看出来,在使用ROW_NUMBER() OVER() 函数之后,重复记录就去掉了。
ps: over() 函数中order by 子句必须写

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值