oracle中查询多个字段并根据部分字段进⾏分组去重说到分组和去重⼤家率先想到的肯定是group by和distinct,
1.distinct对去重数据是要根据所有要查询的字段去重,不能对查询结果部分去重。
例如:
select name ,age ,sex from user where sex = "男";
要是只根据name和age去重,这⾥⽆法使⽤distinct关键字了。
select name ,age ,sex from user where sex = "男" group by name,age;
但是在Oracle数据库中该sql语句是⽆法正常执⾏的,会报如下错误
意思是在Oracle中,group by后的字段需要与select中查询的字段需要⼀⼀对应(函数除外);
3.使⽤over()分析函数
⾸先看原始sql
SELECT t3.*
FROM (
SELECT t1.cateid, t1.product_id, t1.user_type, t2.expire_time
FROM (
SELECT cfg.cateid, cfg.product_id, cfg.user_type
FROM xshe_product_cfg cfg
WHERE cfg.product_id IN (1080005002, 1100000001, 1100000002)
) t1
LEFT JOIN (
SELECT*
FROM xshe_stock
WHERE status ='04'
AND expire_time >= sysdate
) t2
ON t1.cateid = t2.cateid
) t3
得到的数据结果集
我们想根据cateid和product_id查询出有效期离得最近的⼀条记录,这⾥把重复数据都查询出来了
这⾥我们使⽤row_number() over()函数进⾏去重
SELECT t3.*
FROM (
distinct查询SELECT t1.cateid, t1.product_id, t1.user_type, t2.expire_time, ROW_NUMBER() OVER (PARTITION BY t1.cateid, t1.product_id ORDER pire_time ASC) AS ROW_NUM FROM (
SELECT cfg.cateid, cfg.product_id, cfg.user_type
FROM xshe_product_cfg cfg
WHERE cfg.product_id IN (1080005002, 1100000001, 1100000002)
) t1
LEFT JOIN (
SELECT*
FROM xshe_stock
WHERE status ='04'
AND expire_time >= sysdate
) t2
ON t1.cateid = t2.cateid
)
t3
WHERE t3.ROW_NUM =1
这⾥我们就对数据进⾏了完整的去重操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。