按总和过度分区
Posted
技术标签:
【中文标题】按总和过度分区【英文标题】:OVER PARTITION BY SUM 【发布时间】:2020-03-04 10:43:45 【问题描述】:我与所有者、汽车、价格有一张桌子。在单个查询中(使用 over 和 partition by),我需要得到一列,其中包含所有者所有汽车中汽车的价值份额(一个所有者可以拥有多辆汽车)和所有汽车中汽车的价值份额。我做了这样的事情
price::decimal/sum(price)OVER(PARTITION BY owners.id),
price::decimal/sum(price)OVER(PARTITION BY SUM(price))
第一个工作完美,但我不知道如何做第二个。 SUM 不起作用,因为我们必须指出列,但是在这种情况下如何获得所有汽车的总和值?
例如,我只有 3 辆车,每辆车 10 美元。有 2 个车主 A 和 B。A 有 2 辆车。所以我需要得到
A 的第一辆汽车 50%(A 的汽车价值)33%(所有汽车的价值) A 的第二辆汽车 50%(A 的汽车价值)33%(所有汽车的价值) B 的第一辆汽车 100%(B 的汽车价值)33%(所有汽车的价值)我只是好奇我可以在没有任何子查询的情况下做到这一点,只需使用 Partition By
【问题讨论】:
请向我们展示您开始使用的一些数据以及您期望得到的结果?也请向我们展示整个查询。 我只有 3 辆汽车,每辆 10 美元。有 2 个车主 A 和 B。A 有 2 辆车。所以我需要得到```A 1st car 50%(of A's cars) 33%(of all)|||A 2nd car 50%(of A's cars) 33%(of all)|| B 第一辆车 100%(B 的车) 33%(全部)我只是好奇我可以在没有任何子查询的情况下做到这一点,只需使用 Partition By 请在您的问题中添加此附加信息。您可以使用问题下方的编辑按钮更新您的问题。另外不要忘记添加适合您的代码,如您所说:“第一个运行良好” 【参考方案1】:这是一种方式:
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
,已四舍五入到小数点后四位。您可以根据自己的需要进行更改。
结果:
【讨论】:
非常感谢 :) 就这么简单!以上是关于按总和过度分区的主要内容,如果未能解决你的问题,请参考以下文章
ERROR 1064 (42000) 过度分区语法中的数据库错误