HIVE 窗口函数处理重复数据

窗口函数row_number(),结合OVER子句中的PARTITION BYORDER BY,为数据分组内的每一行生成一个唯一的序号。具体分析如下:

函数作用:

  • row_number():为每个分组内的行分配一个唯一的连续序号(从1开始)。

OVER子句详解:

  1. PARTITION BY t1.org_code, t1.customer_code

    • 将数据按 org_code(机构代码)和 customer_code(客户代码) 分组。

    • 窗口计算会独立发生在每个分组内

  2. ORDER BY t1.id DESC

    • 在每个分组内,按 id 字段降序排列 (即 id 值最大的排在最前面)。

    • 序号分配基于此排序:最大的 id 对应 rank=1,次大的 id 对应 rank=2,以此类推

结果列名:

  • 生成的序号列名为 rank(可在后续查询中通过此名称引用)。

典型使用场景示例:

复制代码
SELECT *
FROM (
    SELECT 
        t1.*,
        ROW_NUMBER() OVER (
            PARTITION BY t1.org_code, t1.customer_code
            ORDER BY t1.id DESC
        ) AS rank
    FROM your_table t1
) subquery
WHERE rank = 1; -- 获取每个分组内最新的一条记录(id最大)

注意事项:

  • 若需要完全去重 (如多行 id 相同时只取一条),优先用 ROW_NUMBER()

  • 若需保留相同 id 的所有记录 ,改用 RANK()DENSE_RANK()

  • 性能:在分区字段(org_code, customer_code)和排序字段(id)上建立索引可加速计算。

相关推荐
huazhixuthink1 小时前
PostgreSQL三种关闭方式的区别
数据库·postgresql
阿里小阿希5 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
白鹭6 小时前
MySQL源码部署(rhel7)
数据库·mysql
666和7777 小时前
Struts2 工作总结
java·数据库
还听珊瑚海吗7 小时前
SpringMVC(一)
数据库
星期天要睡觉8 小时前
MySQL 综合练习
数据库·mysql
Y4090018 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
JosieBook9 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql