【问题标题】:Row total by grand total in redshift or sqlredshift 或 sql 中的总计行总计
【发布时间】:2021-07-27 13:51:13
【问题描述】:

我希望除以一列的行级数据以及该列的总计。以下是我拥有的数据集。

date       |   sales    |    avg
2018-12-01 |    10      |   10/215
2018-12-02 |    40      |   40/215
2018-12-03 |    40      |   40/215
2018-12-04 |    10      |   10/215
2018-12-05 |    30      |   30/215
2018-12-06 |    20      |   20/215
2018-12-07 |    35      |   35/215
2018-12-08 |    30      |   30/215
Grand total|    215     

在“平均值”列中,我希望将行数据除以该列的总计,以了解该特定日期的平均值。我们的数据库使用红移来提取数据。我们如何解决上述问题?另外,我不想显示总计行。

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    你会使用窗口函数:

    select t.*,
           sales * 1.0 / sum(sales) over () as sales_ratio
    from t;
    

    【讨论】:

    • 我可以知道你乘以 1.0 是什么意思吗?是否像您尝试采用的 100% 平均值一样,这是否意味着我们甚至不能将 group by 与窗口函数一起使用?可以用吗?
    • @ScribbledMind - 它会导致数据类型的隐式强制。否则你会得到int_x / int_y,其中(由于整数数学,并且y大于x)总是会产生0(你不想要的)。
    【解决方案2】:

    我知道这不是最佳解决方案,但仍然有效,而且它是您的另一种可能性。

    Select *,
        AVG = (sales/(select sum(sales)from your_table))
    from your_table
        
    

    【讨论】:

    • 是的,这是真的……我会改变的!
    • 我觉得左连接也会带来太多重复的行@MatBailie - 对吗?因为它不会在行级别上,并且会为 t1 中的每一行创建 t1 * count(t2) 次。
    • @ScribledMind - LEFT JOIN 指向始终只包含一行的结果集。现在重复,首先使用LEFT JOIN 毫无意义。
    • 在这种情况下,我使用 AVG 来命名一个不与函数一起使用的列。
    • 你仍然有一个整数除以另一个整数,其中分母总是大于分子,这意味着你总是会得到0。一个常见的解决方案是使用a * 1.0 / b
    猜你喜欢
    • 2020-12-23
    • 2016-07-18
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多