问题描述
我有一个包含约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;