sql - 在 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 供应商有关。
解决方案
在几乎所有支持窗口函数的数据库中,窗口函数都会比子查询执行得更好。窗口函数就是为此目的而设计的。而且,如果要将功能添加到数据库中,它的性能可能至少与替代方案一样好。(也就是说,相同的逻辑似乎不适用于pivot
,但这不是跨数据库比较的标准功能。)
您的示例特别简单,因此这两种方法可能非常接近。如果您有partition by
vs join
,那么除了最小的数据集之外,它可能会被放弃。
我同意 TheImpaler 对于此类问题,您应该对您的数据库和数据进行测试。但我希望窗口函数通常会直接获胜,可能是平局,因为您的示例是一个非常简单的用例。
推荐阅读
- android - 通过 USB OTG 电缆从 Android 向合成器发送数据时丢失 MIDI 事件
- microsoft-graph-api - 日历 ID 随机更改
- c++ - 为什么我们甚至在一个类中提到友元函数?
- python - Python Etsy API - 如何更新列表属性?
- c# - 我在统一制作 ui 按钮时遇到问题
- ios - 单元测试时奇怪的数学运算符
- azure - 获取一年中的一周 - 天蓝色数据工厂中的表达式和函数
- javascript - React 中的搜索功能无响应
- python - 使用 tkinter,我如何告诉我的脚本使用 IDLE 编辑器?
- autohotkey - 使 Autohotkey 单击 chrome 中的特定按钮