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

Posted SimonHu1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语句是无法正常执行的,会报如下错误

意思是在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 (
    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) 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

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

 

以上是关于oracle中查询多个字段并根据部分字段进行分组去重的主要内容,如果未能解决你的问题,请参考以下文章

SQL多个字段如何去重

Solr的查询结果去重

Oracle数据库,模糊查询去重查询

【SQL】根据一个字段分组求另一个字段的最大值,并带出其他字段

SQL中查询多个字段时,GROUP BY 要怎么使用?

oracle中查询中单表多字段去重,怎么实现?