SQL通过group by去重(kingbase适用)

平台是国产的kingbase数据库,理论上和oracle差不多,MySQL不确定。


之所以不用distinct而用group by,是因为现实问题中的去重并不是所有词条都要去重,而一但用了distinct,其后的所有词条都会去重,没有选择的余地。

group by必须搭配聚合函数使用,去重时常常和max()一起用,当然你要用count之类的也是可以的。

方案一

网上不少教程常用的方法是:


SELECTphone,name,company,count(distinct phone)

FROMsd_spider_user

WHERE 1

GROUP BY phone;

即什么词条要去重直接group by该词条就行。然而kingbase平台这样使用会提示让你将所有出现过的词条都写在group by之后,不然会报错,即要写成


SELECTphone,name,company,count(distinct phone)

FROMsd_spider_user

WHERE 1

GROUP BY phone,name,company;

这样一来确实能正常运行了,但是效果就变成了所有词条都去重。那我为什么不直接用distinct呢?

方案二

kingbase中用group by 对特定词条去重,需要写对原表的一个子查询,提取需要去重的词条,聚合后group by;再用原表inner join该子查询。例子如下:


FROM "SA"."DEA_SEWAGE_PAID_TRANS_ANNO" as se1 inner join (select max(sid) as sid,PROJECT_CODE,PLATFORM_CODE as platform_code from "SA"."DEA_SEWAGE_PAID_TRANS_ANNO"

group by sid,PROJECT_CODE,PLATFORM_CODE) as a

on se1.sid=a.sid and se1.platform_code=a.platform_code

其中 sid、PROJECT_CODE和PLATFORM_CODE 就是需要去重的对象。

你可能感兴趣的:(SQL通过group by去重(kingbase适用))