按总和过度分区

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,已四舍五入到小数点后四位。您可以根据自己的需要进行更改。

结果:

【讨论】:

非常感谢 :) 就这么简单!

以上是关于按总和过度分区的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 hive 分区以提高性能与过度分区

SQL Server : 过度分区

使用 WITH 和过度分区困难更新表

ERROR 1064 (42000) 过度分区语法中的数据库错误

SQL Server - 使用 ROWS BETWEEN UNBOUNDED PRECEDING 的分区过度不起作用?

将数组划分为 k 个连续分区,使得最大分区的总和最小