我有一张 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辆车。所以我需要得到 p>
- 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
我使用了round
,四舍五入到小数点后四位。您可以根据需要更改它。
结果:
关于sql - 按总和过度分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60524242/