mysql分组查询局部显示_oracle中查询多个字段并根据部分字段进行分组去重

说到分组和去重大家率先想到的肯定是group by和distinct,

1.distinct对去重数据是要根据所有要查询的字段去重,不能对查询结果部分去重。

例如:

select name ,age ,sex from user where sex = "男";

要是只根据name和age去重,这里无法使用distinct关键字了。

2.group by ,可以在mysql中进行分组查询

select name ,age ,sex from user where sex = "男" group by name,age;

但是在Oracle数据库中该sql语句是无法正常执行的,会报如下错误

bf2a7a6fdb70a28ea829c826342fa72c.png

意思是在Oracle中,group by后的字段需要与select中查询的字段需要一一对应(函数除外);

3.使用over()分析函数

首先看原始sql

SELECT t3.*

FROM(SELECTt1.cateid, t1.product_id, t1.user_type, t2.expire_timeFROM(SELECTcfg.cateid, cfg.product_id, cfg.user_typeFROMxshe_product_cfg cfgWHERE cfg.product_id IN (1080005002, 1100000001, 1100000002)

) t1LEFT JOIN(SELECT *

FROMxshe_stockWHERE status = ‘04‘

AND expire_time >=sysdate

) t2ON t1.cateid =t2.cateid

) t3

得到的数据结果集

8713b6d830744196e4d0a0a00a2cf584.png

我们想根据cateid和product_id查询出有效期离得最近的一条记录,这里把重复数据都查询出来了

这里我们使用row_number() over()函数进行去重

SELECT t3.*

FROM(SELECT t1.cateid, t1.product_id, t1.user_type, t2.expire_time, ROW_NUMBER() OVER (PARTITION BY t1.cateid, t1.product_id ORDER BY t2.expire_time ASC) ASROW_NUMFROM(SELECTcfg.cateid, cfg.product_id, cfg.user_typeFROMxshe_product_cfg cfgWHERE cfg.product_id IN (1080005002, 1100000001, 1100000002)

) t1LEFT JOIN(SELECT *

FROMxshe_stockWHERE status = ‘04‘

AND expire_time >=sysdate

) t2ON t1.cateid =t2.cateid

) t3WHERE t3.ROW_NUM = 1

fd8c51387becd0828727bbb9edf389f7.png

这里我们就对数据进行了完整的去重操作。

oracle中查询多个字段并根据部分字段进行分组去重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值