SQL:添加行值并显示在新列中

Posted

技术标签:

【中文标题】SQL:添加行值并显示在新列中【英文标题】:SQL: Add the row values and display in new column 【发布时间】:2015-05-16 13:45:41 【问题描述】:

我有按tasteRating订购的表t1

    Fruit | tasteRating|Cost 
    -----------------------
    Apple |  99       | 1  
    Banana|  87       | 2  
    Cherry|  63       | 5 

我想要t2

    Fruit | Cost | Total Cost
    -------------------------
    Apple |   1  | 1
    Banana|   2  | 3
    Cherry|   5  | 8

有没有办法根据 Cost 的值在 SQL 中动态生成 Total Cost? 在 Redshift 上执行此操作。 谢谢

【问题讨论】:

不,您提供的数据无法使用。 SQL 表表示无序集。要指定排序,您需要一个额外的列,因为数据显然不是按第一列排序的。你还有另一列有排序吗? 添加了更多细节 。 .您尚未指定排序的列。 【参考方案1】:

这样的运行总和可以很容易地在modern DBMS 中使用窗口函数完成:

select col_1,
       sum(col_1) over (order by taste_rating desc) as col_2
from the_table;

但是请注意,没有order by 的运行总和没有意义。所以你必须包含一个定义行顺序的列。

SQLFiddle:http://sqlfiddle.com/#!15/166b9/1

编辑:(戈登)

RedShift 对窗口函数有奇怪的限制。出于某种原因,它需要rows between 语法:

sum(col_1) over (order by taste_rating desc
                 rows between unbounded preceding and current row
                ) as col_2

我不知道为什么它有这个要求。 ANSI 不需要它(尽管它受支持),它在 Postgres(Redshift 的基础数据库)中也没有限制。

【讨论】:

已添加数据库,Redshift支持窗口函数。 得到这个 - 错误:使用 ORDER BY 子句的聚合窗口函数需要一个框架子句 此处的文档:docs.aws.amazon.com/redshift/latest/dg/…。我得到的总数是相反的,知道为什么吗? 已解决,我错过了 order by 中的 desc。谢谢。

以上是关于SQL:添加行值并显示在新列中的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中找到最小值并在新列上添加标签

Pandas str.contains - 在字符串中搜索多个值并在新列中打印值[重复]

将两个行值放入一列,将另一行值放入另一列,可以将更多行值添加到列中

如何使用scala数据框添加具有以下行值的新列[重复]

计算前几行中大于当前行值的值

在另一列上查找最近的时间戳并在新列中添加值 PySpark