【问题标题】:Replacing null values by average of values grouped by concatenated categories in Teradata用 Teradata 中按串联类别分组的值的平均值替换空值
【发布时间】:2021-10-10 19:41:02
【问题描述】:

假设我在名为“score”的列中有很多 NULL 值(缺失值)。我想用一个特定的平均值来替换它们,而不是来自“分数”列的所有值,而是用我用两个连接类别的交叉类别构建的组:

这种查询适用于按组获取平均值:

SELECT
category1 || ' > ' || category2 AS crosscategory,
ROUND(CAST(AVG(score) AS FLOAT), 2) AS score_avg
FROM DatabaseName.TableName
GROUP BY crosscategory
ORDER BY score_avg;

这个可以用常量替换 NULL 值:

SELECT
NVL(score, 0) AS score_without_missing_values
FROM DatabaseName.TableName

我现在无法解决的问题是如何在此处用函数 AVG 和 GROUP BY 计算的平均值表达用常数替换 NULL 值。

非常感谢您的帮助!

【问题讨论】:

    标签: group-by average teradata missing-data imputation


    【解决方案1】:

    看来你想要一个组平均

    SELECT
       t.*,
       coalesce(score, AVG(score) OVER (PARTITION BY category1, category2)) AS score_avg
    FROM DatabaseName.TableName AS t
    

    我删除了 ROUND/CAST,因为 AVG 默认返回 FLOAT 而 ROUND 可能不需要(如果需要,最好转换为 DECIMAL)。

    【讨论】:

    • 我收到 2646 错误:没有更多的假脱机空间
    • 在输出中,我更愿意保留这个:category1 || ' > ' || category2 AS 跨类
    • 当然,你可以保留category1 || ' > ' || category2 AS crosscategory。关于没有更多的假脱机空间:这些类别的行数和数据类型是多少?您也可以尝试重新加入您的组平均值,但这也可能会失败。
    • 分数共有14580行,数据类型为整数。这些类别的数据类型为 VARCHAR。
    • VarChar 的大小是多少? 14580行?这不是很多,您的查询是否在不添加平均值的情况下运行?
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2019-03-21
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多