zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    当···时发生了什么?
    数据存储-3、数据库分库分表思路
    数据存储-2、反模式设计
    数据存储-1、MySQL 索引使用的注意事项
    锁机制-4、synchronized 与 lock 的区别
    锁机制-3、synchronize 实现原理
    锁机制-1、乐观锁与悲观锁以及乐观锁的一种实现方式
    线程-11、线程的生命周期
    线程-10、线程池的几种方式
    线程-9、线程池的实现原理
  • 原文地址:https://www.cnblogs.com/SimonHu1993/p/12819405.html
Copyright © 2011-2022 走看看