首页 > 解决方案 > 在 SQL 中获取类别百分比的最有效方法是什么

问题描述

我想在计算类别百分比时了解 SQL 查询的效率。

假设我有一张这样的桌子 -

with temp as 
(
select "a" as product, 100 as sales union all
select "b" as product, 200 as sales union all
select "c" as product, 300 as sales 

)

每个产品都出现一次,除此之外还有它的销量。现在,如果我想计算每个产品的销售额百分比,在 SQL 中哪个查询更有效?

-- Query 1
with temp as 
(
select "a" as product, 100 as sales union all
select "b" as product, 200 as sales union all
select "c" as product, 300 as sales 

)

select *,
sales * 100 / sum(sales) over ()  as percentage_sales
from temp t

或者

-- Query 2
with temp as 

(
select "a" as product, 100 as sales union all
select "b" as product, 200 as sales union all
select "c" as product, 300 as sales 

)

, total as 
(
select sum(sales) grand_total from temp 
)

select product, sales, 
sales * 100 / t.grand_total as percentage_sales
from temp, total t

哪个查询更高效和优化?它是基于我们使用的SQL引擎吗?还是这里有一个整体的经验法则?

我试图从一个通用的角度来理解它,而不是与任何 DBMS 供应商有关。

标签: sql

解决方案


在几乎所有支持窗口函数的数据库中,窗口函数都会比子查询执行得更好。窗口函数就是为此目的而设计的。而且,如果要将功能添加到数据库中,它的性能可能至少与替代方案一样好。(也就是说,相同的逻辑似乎不适用于pivot,但这不是跨数据库比较的标准功能。)

您的示例特别简单,因此这两种方法可能非常接近。如果您有partition byvs join,那么除了最小的数据集之外,它可能会被放弃。

我同意 TheImpaler 对于此类问题,您应该对您的数据库和数据进行测试。但我希望窗口函数通常会直接获胜,可能是平局,因为您的示例是一个非常简单的用例。


推荐阅读