我想知道哪种方法通常更快(PostgreSQL)? 产品移动示例
SELECT id, quantity, product_id,
sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) sum_quantity
FROM product_moves
WHERE sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) > 10
或
SELECT id, quantity, product_id, sum_quantity
FROM (
SELECT id, quantity, product_id,
sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) sum_quantity
FROM product_moves
) product_moves
WHERE sum_quantity > 10
在第一种方法中,我有两次相同的功能,在第二种方法中,我有两个选择。或者有没有更好的方法来实现这个?
我尝试运行查询,但结果非常不一致。
即使第一种方法执行得很好(因为@jarlh指出的事实),我认为不会有显着差异,因为:
无论如何,我怀疑它们中的任何一个都会获得最佳性能,因为它们都确实对同一个product_id执行了多次完整的SUM操作(我的意思是:当获取行时,相同的product_id值将重复出现多次) ,不是吗?)。
因此,我建议您创建两个查询:一个对 Product_id 的每个唯一值执行 SUM,第二个查询连接第一个查询的表中的所有行以获取总和值。
WITH
sum_by_product AS (SELECT product_id, SUM (quantity) AS sum_quantity FROM product_moves GROUP BY product_id),
detail AS (SELECT t1.id, t1.quantity, t1.product_id, t2.sum_quantity FROM product_moves t1 INNER JOIN sum_by_product t2 ON t1.product_id=t2.product_id)
SELECT * FROM detail WHERE sum_quantity>10
;