You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hive中非空列平均值函数:计算前3年非空收入的平均值

Hive计算前3年非空收入平均值(求和后除以3)

嘿,刚好碰过类似的需求,来给你捋清楚怎么实现!首先得明确核心要求:不管前3年里有多少个非空收入值,最终都是把这些非空值求和后除以3(固定除数是3,不是非空值的数量),这点很关键,别和普通的AVG函数搞混了(普通AVG会除以非空值的个数)。

下面分两种常见的业务场景给你写对应的Hive SQL:

场景1:取每个用户最近3个有非空收入的年份计算平均值

如果你的需求是挑出每个用户历史上最近的3条非空收入记录,求和后除以3,用这段代码:

-- 先过滤掉空收入的记录,再按年份倒序取前3条
WITH user_non_null_income AS (
    SELECT 
        user_id,
        year,
        income
    FROM your_table
    WHERE income IS NOT NULL
),
ranked_income AS (
    SELECT 
        user_id,
        income,
        -- 按用户分组,年份倒序排名,最近的年份排第1
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY year DESC) AS rn
    FROM user_non_null_income
)
SELECT 
    user_id,
    -- 求和前3条非空收入,除以3得到平均值
    SUM(income)/3 AS avg_income_last_3_non_null_years
FROM ranked_income
WHERE rn <= 3
GROUP BY user_id;

场景2:取指定时间范围内(比如近3个自然年)的非空收入计算平均值

如果是要计算每个用户在最近3个完整自然年里的非空收入之和除以3(哪怕某一年收入为空,也不影响除数是3),用这段:

SELECT 
    user_id,
    -- SUM会自动跳过NULL值,求和后除以3
    SUM(income)/3 AS avg_income_last_3_years
FROM your_table
-- 取当前年份及前两年的记录,你也可以改成固定年份比如BETWEEN 2021 AND 2023
WHERE year BETWEEN YEAR(CURRENT_DATE)-2 AND YEAR(CURRENT_DATE)
GROUP BY user_id;

如果是要对每一条年度记录,计算该年份往前推3年(含当年)的非空收入平均值,用窗口函数更高效:

SELECT 
    user_id,
    year,
    -- 窗口函数取当前用户的当前年份及前两年的所有记录,SUM跳过NULL后除以3
    SUM(income) OVER (
        PARTITION BY user_id 
        ORDER BY year 
        RANGE BETWEEN 2 PRECEDING AND CURRENT ROW
    )/3 AS avg_income_prev_3_years
FROM your_table;

注意:Hive里的SUM函数会自动忽略NULL值,所以不用额外判断,直接求和就行,最后除以3就完美符合你的需求啦!

内容的提问来源于stack exchange,提问作者jk7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:19:13