Lakehouse 排名与分位分析指南

概述

排名与分位分析是数据分析中的高级场景,用于计算数据在分组内的相对位置、百分比分位等。云器 Lakehouse 提供完整的窗口函数支持,包括排名函数、偏移函数和聚合窗口函数。本指南按业务场景分类,帮助你快速掌握高效的排名与分位分析方法。

涉及的 SQL 命令

命令/函数用途适用场景
ROW_NUMBER()
ROW_NUMBER()
生成唯一行号去重、分页、Top-N
RANK()
RANK()
排名(并列跳号)成绩排名、竞赛排名
DENSE_RANK()
DENSE_RANK()
排名(并列不跳号)连续排名
PERCENT_RANK()
PERCENT_RANK()
百分比排名相对位置分析
LAG()
LAG()
/
LEAD()
LEAD()
访问前后行数据环比、同比计算
AVG() OVER (... ROWS BETWEEN)
AVG() OVER (... ROWS BETWEEN)
移动平均趋势分析
PERCENTILE()
PERCENTILE()
分位数计算中位数、四分位数

前置准备

以下示例使用模拟的员工绩效表

performance
performance

-- 创建测试表 CREATE TABLE IF NOT EXISTS performance ( emp_id INT, emp_name STRING, dept STRING, score DOUBLE, review_date DATE ); -- 插入测试数据 INSERT INTO performance VALUES (1, 'Alice', 'Engineering', 95, '2024-06-01'), (2, 'Bob', 'Engineering', 85, '2024-06-01'), (3, 'Carol', 'Engineering', 95, '2024-06-01'), (4, 'David', 'Marketing', 88, '2024-06-01'), (5, 'Eve', 'Marketing', 92, '2024-06-01'), (6, 'Frank', 'Marketing', 78, '2024-06-01'), (7, 'Grace', 'HR', 90, '2024-06-01'), (8, 'Henry', 'HR', 85, '2024-06-01');


基础排名

使用排名函数计算员工在部门内的绩效排名。Lakehouse 提供三种排名函数,行为略有不同。

-- 三种排名函数对比 SELECT emp_name, dept, score, ROW_NUMBER() OVER (PARTITION BY dept ORDER BY score DESC) as row_num, RANK() OVER (PARTITION BY dept ORDER BY score DESC) as rank, DENSE_RANK() OVER (PARTITION BY dept ORDER BY score DESC) as dense_rank FROM performance ORDER BY dept, row_num;

结果说明

emp_namedeptscorerow_numrankdense_rank
AliceEngineering95111
CarolEngineering95211
BobEngineering85332
EveMarketing92111
DavidMarketing88222
FrankMarketing78333
GraceHR90111
HenryHR85222

排名函数区别

函数并列处理序号连续性
ROW_NUMBER()
ROW_NUMBER()
随机分配不同序号连续
RANK()
RANK()
并列相同,后续跳号不连续(1,1,3)
DENSE_RANK()
DENSE_RANK()
并列相同,后续连续连续(1,1,2)

百分比排名

使用

PERCENT_RANK()
PERCENT_RANK()
计算员工在部门内的相对位置(0 到 1 之间)。

-- 计算百分比排名 SELECT emp_name, dept, score, ROUND(PERCENT_RANK() OVER (PARTITION BY dept ORDER BY score DESC), 2) as pct_rank FROM performance ORDER BY dept, pct_rank DESC;

结果说明

emp_namedeptscorepct_rank
AliceEngineering950
CarolEngineering950
BobEngineering850.5
EveMarketing920
DavidMarketing880.5
FrankMarketing781
GraceHR900
HenryHR851

前后行对比

使用

LAG()
LAG()
LEAD()
LEAD()
访问当前行的前一行或后一行数据,常用于计算环比变化。

-- 计算部门内员工的分数差值 SELECT emp_name, dept, score, LAG(score, 1) OVER (PARTITION BY dept ORDER BY score DESC) as prev_score, score - LAG(score, 1) OVER (PARTITION BY dept ORDER BY score DESC) as diff FROM performance ORDER BY dept, score DESC;

结果说明

emp_namedeptscoreprev_scorediff
AliceEngineering95NULLNULL
CarolEngineering95950
BobEngineering8595-10
EveMarketing92NULLNULL
DavidMarketing8892-4
FrankMarketing7888-10
GraceHR90NULLNULL
HenryHR8590-5

移动平均

使用窗口帧(ROWS BETWEEN)计算滑动窗口的统计值,适用于趋势分析。

-- 计算部门内按分数排序的移动平均(当前行及前两行) SELECT emp_name, dept, score, ROUND(AVG(score) OVER ( PARTITION BY dept ORDER BY score DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ), 1) as moving_avg_3 FROM performance ORDER BY dept, score DESC;

结果说明

emp_namedeptscoremoving_avg_3
AliceEngineering9595
CarolEngineering9595
BobEngineering8591.7
EveMarketing9292
DavidMarketing8890
FrankMarketing7886
GraceHR9090
HenryHR8587.5

分位数计算

使用

PERCENTILE()
PERCENTILE()
函数计算数据的分位数,如中位数(0.5)、四分位数(0.25, 0.75)。

-- 计算各部门分数的中位数和四分位数 SELECT dept, PERCENTILE(score, 0.5) as median, PERCENTILE(score, 0.25) as q1, PERCENTILE(score, 0.75) as q3, MIN(score) as min_score, MAX(score) as max_score FROM performance GROUP BY dept ORDER BY dept;

结果说明

deptmedianq1q3min_scoremax_score
Engineering9590958595
HR87.586.2588.758590
Marketing8883907892

清理测试数据

完成排名分析验证后,建议清理测试表:

-- 删除测试表 DROP TABLE IF EXISTS performance;


注意事项

  1. 窗口函数执行顺序:窗口函数在
    WHERE
    WHERE
    GROUP BY
    GROUP BY
    之后执行,不能直接在
    WHERE
    WHERE
    中使用窗口函数结果。如需过滤,请使用
    QUALIFY
    QUALIFY
    或子查询。
  2. NULL 值排序
    ORDER BY
    ORDER BY
    默认将
    NULL
    NULL
    排在最后(DESC)或最前(ASC),可使用
    NULLS FIRST/LAST
    NULLS FIRST/LAST
    控制。
  3. 性能优化
    PARTITION BY
    PARTITION BY
    列建议选择基数适中的列,避免单个分区数据过大。
  4. PERCENT_RANK 语法
    PERCENT_RANK()
    PERCENT_RANK()
    不接受参数,直接写
    PERCENT_RANK() OVER (...)
    PERCENT_RANK() OVER (...)

相关文档

联系我们
预约咨询
微信咨询
电话咨询