oracle 根据部分字段去重

问题:在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 子句必须写

你可能感兴趣的:(ORACLE,oracle)