sql - 按总和过度分配

标签 sql postgresql window-functions

我有一张 table ,上面有车主、汽车、价格。在单个查询中(使用 over 和 partition by),我需要获取一列,其中包含车主所有汽车中汽车值(value)的份额(一个车主可以拥有多辆汽车)以及所有汽车中汽车值(value)的份额。我做了这样的事情

price::decimal/sum(price)OVER(PARTITION BY owners.id),

price::decimal/sum(price)OVER(PARTITION BY SUM(price))

第一个工作正常,但我不知道如何做第二个。 SUM 不起作用,因为我们必须指出列,但在这种情况下如何获得所有汽车的总值(value)?

例如,我只有 3 辆车,每辆车售价 10 美元。有2个车主A和B。A有2辆车。所以我需要得到

  • A 的第一辆车 50%(A 汽车的值(value))33%(所有汽车的值(value))
  • A 的第二辆车 50%(A 的汽车值(value))33%(所有汽车的值(value))
  • B 的第一辆车 100%(B 车辆的值(value))33%(所有车辆的值(value))

我只是好奇我是否可以在没有任何子查询的情况下只使用分区依据来做到这一点

最佳答案

这是一种方法:

select 
round((price::decimal/sum(price) over (partition by id)),4) * 100 || ' %' as share_of_owner
, round((price::decimal/sum(price) over()), 4) * 100 || ' %' as share_of_cars
from mytable
group by id, cars, price

here is a demo

我使用了round,四舍五入到小数点后四位。您可以根据需要更改它。

结果:

enter image description here

关于sql - 按总和过度分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60524242/

相关文章:

sql - 带和不带 ORDER BY 子句的分区分析计数

java - 是否可以只用一个查询来检索分成三个表的对象?

mysql - SQL 仅选择列上具有最大值的行

sql - 使 OR 查询更加简化

sql - 按列按 3 组分组

java - Spark Hive - 带窗口函数的 UDFArgumentTypeException?

mysql - where 子句中的未知列

postgresql - 无法使用 ASP.NET Core 和身份添加声明

postgresql - 触发器,在插入之前初始化一个值(PostgreSQL)

java - 如何使用 Jooq 查询不区分大小写的列?