【发布时间】:2018-09-20 18:50:31
【问题描述】:
下面提到的查询调用另一个过程getcurrencyexchangerate()。这怎么能调用一次,到处使用呢?如何在 where 子句之外使用 "CASE WHEN in_currency != -1 THEN speedy.currency_code = in_currency ELSE TRUE END" 以提高性能?
SELECT
-- LOGINS
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('logins') THEN
speedy.count ELSE 0 END),0) as login,
-- REGISTRATIONS
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('registrations') THEN
speedy.count ELSE 0 END),0) as registration,
-- COMPLETED DEPOSITS
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('manual_deposit', 'deposit') AND
LOWER(speedy.status) IN ('success', 'pending approval') THEN
(speedy.amount_1 * (CASE WHEN in_currency = -1 THEN (SELECT getcurrencyexchangerate(speedy.currency_code)) ELSE 1 END) )
ELSE 0 END),0) as deposit,
-- COMPLETED WITHDRAWS
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('withdraw') AND
LOWER(speedy.status) IN ('success') THEN
(speedy.amount_2 * (CASE WHEN in_currency = -1 THEN (SELECT getcurrencyexchangerate(speedy.currency_code)) ELSE 1 END) )
ELSE 0 END),0) as withdraw,
-- BONUS SUM
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('bonus', 'manual_bonus') AND
LOWER(speedy.status) IN ('success') THEN
(speedy.amount_1 * (CASE WHEN in_currency = -1 THEN (SELECT getcurrencyexchangerate(speedy.currency_code)) ELSE 1 END) )
ELSE 0 END),0) as bonus,
-- MANUAL BONUS SUM
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('manual_bonus') AND
LOWER(speedy.status) IN ('success') THEN
(speedy.amount_1 * (CASE WHEN in_currency = -1 THEN (SELECT getcurrencyexchangerate(speedy.currency_code)) ELSE 1 END) )
ELSE 0 END),0) as manualbonus,
-- BONUS WAGERED
COALESCE(sum(
CASE WHEN speedy.base_transaction_type IN ('bonus_wagered') AND
LOWER(speedy.status) IN ('success') THEN
(speedy.amount_1 * (CASE WHEN in_currency = -1 THEN (SELECT getcurrencyexchangerate(speedy.currency_code)) ELSE 1 END) )
ELSE 0 END),0) as bonuswager
FROM speedy_reports_data AS speedy
WHERE
speedy.for_date BETWEEN '2017-08-31' AND '2018-08-31' AND
(CASE WHEN in_currency != -1 THEN speedy.currency_code = in_currency ELSE TRUE END)
speedy_reports_data 表在列(for_date、skin_id、country_code、currency_code、is_test、base_transaction_type、status)上具有相同顺序的复合键。此表上没有其他索引
【问题讨论】:
-
in_currency 可能的值是多少?你的情况似乎不正确
-
整数将以货币形式出现,其中每个 id 都映射到一种货币。例如 1-> 美元 2-> 欧元。对于-1值,需要把所有币种的数据汇总起来,换算成单一币种
标签: sql query-optimization database-performance postgresql-9.5