问题:在oracle中使用group by分组,group by子句中必须包含所有的select中的字段和order by子句中的字段。
在不使用group by子句的情况下,进行分组。(根据部分字段分组)
over()分析函数
原sql
SELECTIM. ID mediaGroupId,IC. ID cardId,IC.CARD_CONTENT,IC.CARD_TITLE,IM.UPDATE_TIME mediaUpdateTime,IP.SM_URL cardImgUrl,ICB.BUTTON_NAMEFROMINFO_MEDIA IMLEFT JOIN INFO_CARD IC ON IM. ID = IC.MEDIA_IDLEFT JOIN INFO_CARD_BUTTON ICB ON IC. ID = ICB.CARD_IDLEFT JOIN INFO_PIC IP ON IP. ID = IC.MEDIA_PIC_IDWHEREIM. ID = '1'ORDER BYIM.UPDATE_TIME DESC
我需要根据cardId字段去重,但是看结果还是有重复的。如果使用group by子句的话,是 无法去重 的。因为button_name字段值是不同的,oracle还是会认为两条记录不重复。
改进sql
SELECT*FROM(SELECTIM. 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_NUMFROMINFO_MEDIA IMLEFT JOIN INFO_CARD IC ON IM. ID = IC.MEDIA_IDLEFT JOIN INFO_CARD_BUTTON ICB ON IC. ID = ICB.CARD_IDLEFT JOIN INFO_PIC IP ON IP. ID = IC.MEDIA_PIC_IDWHEREIM. ID = '1'ORDER BYIM.UPDATE_TIME DESC) T3WHERE T3.ROW_NUM = 1
可以看出来,在使用ROW_NUMBER() OVER() 函数之后,重复记录就去掉了。
ps: over() 函数中order by 子句必须写