首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用PSQL根据其他列的值生成百分比

在 PostgreSQL 中,你可以使用窗口函数来根据其他列的值生成百分比。窗口函数允许你在查询结果中进行复杂的计算,比如计算某一列的总和,然后基于该总和计算每一行的百分比。

假设你有一个名为 sales 的表,包含以下列:

  • id: 唯一标识符
  • product: 产品名称
  • amount: 销售金额

你想计算每个产品的销售金额占总销售金额的百分比。

示例数据

假设你的 sales 表包含以下数据:

代码语言:javascript
复制
CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    product VARCHAR(50),
    amount NUMERIC
);

INSERT INTO sales (product, amount) VALUES
('Product A', 100),
('Product B', 200),
('Product C', 300),
('Product A', 150),
('Product B', 250),
('Product C', 350);

计算百分比

你可以使用窗口函数 SUM()OVER() 来计算每个产品的销售金额占总销售金额的百分比。以下是一个示例查询:

代码语言:javascript
复制
SELECT
    product,
    amount,
    amount / SUM(amount) OVER () * 100 AS percentage
FROM
    sales;

解释

  1. SUM(amount) OVER ():计算所有行的 amount 总和。OVER () 表示在整个结果集上计算总和。
  2. amount / SUM(amount) OVER () * 100:计算每行的 amount 占总和的百分比。

结果

执行上述查询后,你将得到以下结果:

代码语言:javascript
复制
 product  | amount |     percentage
----------+--------+-------------------
 Product A|    100 |  10.0000000000000
 Product B|    200 |  20.0000000000000
 Product C|    300 |  30.0000000000000
 Product A|    150 |  15.0000000000000
 Product B|    250 |  25.0000000000000
 Product C|    350 |  35.0000000000000

按产品分组计算百分比

如果你想按产品分组计算每个产品的销售金额占总销售金额的百分比,可以使用以下查询:

代码语言:javascript
复制
WITH product_totals AS (
    SELECT
        product,
        SUM(amount) AS total_amount
    FROM
        sales
    GROUP BY
        product
)
SELECT
    product,
    total_amount,
    total_amount / SUM(total_amount) OVER () * 100 AS percentage
FROM
    product_totals;

解释

  1. WITH product_totals AS (...):使用公用表表达式(CTE)计算每个产品的总销售金额。
  2. SUM(total_amount) OVER ():计算所有产品的总销售金额。
  3. total_amount / SUM(total_amount) OVER () * 100:计算每个产品的总销售金额占所有产品总销售金额的百分比。

结果

执行上述查询后,你将得到以下结果:

代码语言:javascript
复制
 product  | total_amount |     percentage
----------+--------------+-------------------
 Product A|          250 |  25.0000000000000
 Product B|          450 |  45.0000000000000
 Product C|          650 |  65.0000000000000
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 如何使用python连接MySQL表

    在本文中,我们将深入探讨使用 Python 和 PyMySQL 库连接 MySQL 表过程。...此技术对于需要使用 MySQL 数据库数据分析师和开发人员等个人特别有用,他们需要将多个合并到一个字符串中。...我们可以使用 close() 方法关闭连接对象,如下所示: connection.close() 这将释放连接和游标对象占用资源,允许程序其他部分或系统上运行其他程序使用它们。...结论 总之,我们已经学会了如何使用Python连接MySQL表,这对于任何使用关系数据库的人来说都是一项宝贵技能。...通过使用 PyMySQL 库,我们可以轻松连接到 MySQL 数据库、执行 SQL 查询并连接。此技术在各种方案中都很有用,例如生成报告或分析数据。

    22230

    mysql使用default给设置默认问题

    add column会修改旧默认 add column和modify column在default语义上处理不一样。...对于add column,会将历史为null刷成default指定。 而对于modify column,只会对新数据产生影响,历史数据仍然会保持为null。...即使指定了default,如果insert时候强制指定字段为null,入库还是会为null 3....如果仅仅是修改某一个字段默认,可以使用 alter table A alter column c set default 'c'; 用这种方式来替换modify,会省去重建表操作,只修改frm文件...结论:mysql 默认只有在insert语句中没有这个字段时才会生效,如果insert中有插入该字段而该字段取值又为null,null将被插入到表中,默认值此时失效。

    75710

    如何使用Excel将某几列有标题显示到新

    如果我们有好几列有内容,而我们希望在新中将有内容标题显示出来,那么我们怎么做呢? Excel - TEXTJOIN function 1....- - - - 4 - - - 在开始,我们曾经使用INDEX + MATCH方式,但是没有成功,一直是N/A https://superuser.com/questions/1300246/if-cell-contains-value-then-column-header...所以我们后来改为TEXTJOIN函数,他可以显示,也可以显示标题,还可以多个列有时候同时显示。...- - 4 - - - 15 Year 5 - - - - 5 - - - =TEXTJOIN(", ",TRUE,IF(ISNUMBER(B2:I2),$B$1:$I$1,"")) 如果是想要显示,...则: =TEXTJOIN(", ",TRUE,IF(ISNUMBER(B2:I2),B2:I2,"")) 其中,ISNUMBER(B2:I2)是判断是不是数字,可以根据情况改成是不是空白ISBLANK

    11.3K40

    根据N种规格中M种规格生成全部规格组合一种算法

    近来在开发SKU模块时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格数组由用户制定且随时可以编辑,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格,各种规格组合便是一个型号...,比如说,颜色是商品规格一类,可能有红、黄、绿、蓝,而尺码是另一类规格,可能取值有L、M。...这类问题首先考虑方法是用递归,但返回之间并没有相互依赖关系,到底什么时候结束是个问题,用嵌套循环又会由于数组维度及深度不得而知而变得困难重重,后来,想到了一种很可能并非性能最优,但简单直观方法...} specValueList.splice(0, 1); arrGroup = generateGroup(specValueList, tempGroup); } } /** * 生成规格组合方法...newTempGroup.length > 0){ tempGroup = newTempGroup; } } return tempGroup; } 其中generateTrRow方法是我生成表格中行用到

    86910

    PostgreSQL 教程

    完全外连接 使用完全连接查找一个表中在另一个表中没有匹配行行。 交叉连接 生成两个或多个表中笛卡尔积。 自然连接 根据连接表中公共列名称,使用隐式连接条件连接两个或多个表。 第 4 节....更新 更新表中现有数据。 连接更新 根据另一个表中值更新表中。 删除 删除表中数据。 连接删除 根据另一个表中删除表中行。 UPSERT 如果新行已存在于表中,则插入或更新数据。...序列 向您介绍序列并描述如何使用序列生成数字序列。 标识 向您展示如何使用标识。 更改表 修改现有表结构。 重命名表 将表名称更改为新名称。 添加 向您展示如何向现有表添加一或多。...检查约束 添加逻辑以基于布尔表达式检查。 唯一约束 确保一或一组在整个表中是唯一。 非空约束 确保不是NULL。 第 14 节....UUID 指导您如何使用UUID数据类型以及如何使用提供模块生成UUID。 数组 向您展示如何使用数组,并向您介绍一些用于数组操作方便函数。

    53110

    盘点使用Pandas解决问题:对比两数据取最大5个方法

    一、前言 前几天在Python星耀交流群有个叫【iLost】粉丝问了一个关于使用pandas解决两数据对比问题,这里拿出来给大家分享下,一起学习。...大概意思是说在DF中有2数据,想每行取两数据中最大,形成一个新,该怎么写?最开始【iLost】自己使用了循环方法写出了代码,当然是可行,但是写就比较难受了。...】,这里使用apply方法来解决,代码如下 df['max3'] = df[['cell1', 'cell2']].apply(max, axis=1) df 方法四:【常州-销售-MT】解答 这个方法也是才哥群里一个大佬给思路...使用numpy结合pandas,代码如下: df['max4'] = np.where(df['cell1'] > df['cell2'],df['cell1'], df['cell2']) df...这篇文章基于粉丝提问,针对df中,想在每行取两数据中最大,作为新问题,给出了具体说明和演示,一共5个方法,顺利地帮助粉丝解决了问题,也帮助大家玩转Pandas,学习Python相关知识。

    4.1K30

    如何在Ubuntu 18.04上安装和使用PostgreSQL

    ,则您应该输入: $ sudo -u postgres createuser --interactive 该脚本将提示您一些选择,并根据响应执行正确Postgres命令,以根据规范创建用户。...接下来两个命令设备分别创建type和color,其中每一个可以不为空。之后命令会创建一个location并创建一个约束,该约束要求该为八个可能之一。...例如,不要将列名包装在引号中,但是您输入确实需要引号。 另外要记住是,您不要为equip_id输入。这是因为只要创建表中新行,就会自动生成此项。...及其中,但保留所有其他数据。...更新表中数据 到目前为止,您已经学习了如何向表中添加记录以及如何删除它们,但本教程尚未介绍如何修改现有条目。 您可以通过查询所需记录并将设置为您要使用来更新现有条目的

    5.4K60

    如何在Debian 8上安装和使用PostgreSQL 9.4

    要创建其他角色,我们可以使用createuser命令。...命令来根据规范创建用户。...我们已经为此列提供了主键约束,这意味着必须是唯一而不为空。 对于我们两个,我们没有给出字段长度。这是因为某些类型不需要设置长度,因为类型隐含了长度。...然后我们给出设备类型和颜色,每个都不能为空。然后,我们创建一个位置并创建一个约束,该约束要求该为八个可能之一。最后一是日期,记录我们安装设备日期。...首先,请记住不应引用列名,但是您输入确实需要引号。 要记住另一件事是我们不输入equip_id。这是因为只要创建表中新行,就会自动生成此项。

    4.3K00

    如何在Ubuntu 16.04上安装和使用PostgreSQL

    如果您希望用户连接到其他数据库,可以通过指定数据库来执行此操作: psql -d postgres 登录后,您可以通过键入以下内容来检查当前连接信息: \conninfo You are connected...然后,我们给出了设备type和color,其中每一个不能为空。我们创建一个location并创建一个约束,要求该为八个可能之一。最后一是日期,记录我们安装设备日期。...首先,请记住不应引用列名,但是您输入确实需要引号。 要记住另一件事是我们不输入equip_id。这是因为只要创建表中新行,就会自动生成此项。...如果我们想在创建表之后修改表以添加其他,我们可以轻松地执行此操作。...您可以通过查询所需记录并将设置为您要使用来更新现有条目的。我们可以查询“swing”记录(这将匹配我们表中每个 swing)并将其颜色更改为“red”。

    5.2K10

    Edge2AI之使用 FlinkSSB 进行CDC捕获

    这可以根据需要更具体到选定数据库和主机。...返回 SSH 会话,在psql提示符下,执行以下语句以在transactions表上生成活动并验证更改是否已成功复制到该trans_replica表。...这会将其他元数据暴露给流,例如对表执行操作类型以及更改前后。 这种类型信息对于分析数据如何变化用例可能很重要,而不是简单地查看它最新状态。...回到 SSH 会话,在psql提示符下,执行以下语句以在transactions表上生成活动。...事件beforeDELETE是更新前记录状态,而事件afterINSERT是更新后状态。 DELETE:操作会生成一个带有op=d. 该after是null因为操作完成后数据不再存在。

    1.1K20

    Greenplum 实时数据仓库实践(9)——Greenplum监控与运维

    分隔符 文本文件和CSV文件缺省分隔符分别是TAB(ASCII为0x09)和逗号(ASCII为0x2C)。...表示空(NULL)表示一未知数据。可以指定数据文件中一个字符串表示空。...runaway_detector_activation_percent参数设置触发自动终止查询内存限额百分比,缺省为90,即当内存使用量达到gp_vmem_protect_limit90%,数据库将开始终止查询...从内存消耗量最大查询开始,一直到内存使用量低于指定百分比为止。...在大表上运行分析可能需要很长时间,如果无法对非常大所有运行分析,则只能使用 ANALYZE table(column, ...)为选定生成统计信息,确保包含join、where、sort、group

    3.7K32

    GP使用

    3、资源队列 1、限制并发查询数 ACTIVE_STATEMENTS 2、限时查询使用内存总量 MEMORY_LIMIT 3、控制查询优先级 PRIORITY 4、根据查询成本代价做限时 MIN_COST...指定CPU使用百分比使用Linux控制组 内存 在队列和操作级别管理,用户可以过量使用 在事务级别管理,可以进一步分配和追踪,用户不可以过量使用。...,越靠后列成本越高 4、储存 1)、一存一个单独文件 2)、读取任意成本一样 3)、压缩比高于行储存 4)、访问越多,开销越大 7、储存模式及对比 数据库中表储存模式 HEAP表 行存...第三节日常维护对性能提升 1、统计信息 统计信息作用 - 估算表大小及数据膨胀情况 - 帮助优化器生成最优执行计划 使用analyze 手机统计信息 - 运行命令 : analyze tablename...问题案例 数据正常使用时,突然性能慢,用户体验很卡,正常简单查询耗时长 2、原因分析 1)、内存不足,使用swap交换空间 2)、CPU负载高 3)、磁盘IO繁忙 3、快速定位 根据节点服务器占用系统资源最大进程

    1.6K30
    领券