使用子查询优化汇总Postgres查询

问题描述

我有一个包含约4个子查询的汇总查询。问题是,只有2500多个行,大约需要5秒钟才能完成。有没有人可以帮助您优化此查询?

任何帮助将不胜感激。

SELECT * FROM (
SELECT
    DISTINCT ON(i.name) i.name,i.invoice_number,i.created_date,(SELECT COUNT (i2.customer_id) FROM invoices i2 WHERE i.invoice_number = i2.invoice_number) AS total_customers,(SELECT COUNT (i2.status) FROM invoices i2 WHERE i.invoice_number = i2.invoice_number AND i2.status = 'PAID') AS total_full_payments,(SELECT COUNT (i2.status) FROM invoices i2 WHERE i.invoice_number = i2.invoice_number AND i2.status = 'PARTIALLY_PAID') AS total_part_payments,(SELECT COUNT (i2.status) FROM invoices i2 WHERE i.invoice_number = i2.invoice_number AND i2.status = 'UNPAID') AS total_no_payments
FROM
    invoices i WHERE i.client_id = 2
GROUP BY
    i.name,i.customer_id,i.created_date
) i
ORDER BY i.created_date DESC
OFFSET 0 LIMIT 10

解决方法

使用条件聚合!目前还不清楚您的查询在做什么,但这似乎是一个合理的查询:

SELECT i.name,MIN(i.created_date),COUNT(*) as total_customers,COUNT(*) FILTER (WHERE i.status = 'PAID') AS total_full_payments,COUNT(*) FILTER (WHERE i.status = 'PARTIALLY_PAID') AS total_part_payments,COUNT(*) FILTER (WHERE i.status = 'UNPAID') AS total_no_payments
FROM invoices i
WHERE i.client_id = 2
GROUP BY i.name
ORDER BY MIN(created_date) DESC;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...