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

 這里我們就對數據進行了完整的去重操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM