Sql 在查询中重用分区上的和返回值
我正在寻找一种方法,以避免在查询中执行两次计算,如:Sql 在查询中重用分区上的和返回值,sql,postgresql,Sql,Postgresql,我正在寻找一种方法,以避免在查询中执行两次计算,如: SELECT DISTINCT coins.price_btc, coins.price_eur, coins.price_usd, coins.currency_name, coins.currency_symbol, SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin
SELECT DISTINCT
coins.price_btc,
coins.price_eur,
coins.price_usd,
coins.currency_name,
coins.currency_symbol,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) * coins.price_eur AS holdings_eur,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) * coins.price_usd AS holdings_usd,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) * coins.price_btc AS holdings_btc,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) AS holdings
FROM
market_transactions
INNER JOIN coins ON coins.id = market_transactions.market_coin_id
WHERE
market_transactions.user_id = 1
ORDER BY
coins.currency_symbol
我不确定分区上的总和是否一直在运行
感谢您的指点,我相信查询也可以优化,但我不确定从哪里开始
CREATE TABLE "public"."coins" (
"id" int8 NOT NULL DEFAULT nextval('coins_id_seq'::regclass),
"currency_symbol" text COLLATE "pg_catalog"."default" NOT NULL DEFAULT NULL,
"currency_name" text COLLATE "pg_catalog"."default" NOT NULL DEFAULT NULL,
"price_usd" numeric(16,7) NOT NULL DEFAULT NULL,
"price_eur" numeric(16,7) NOT NULL DEFAULT NULL,
"price_btc" numeric(16,7) NOT NULL DEFAULT NULL,
CONSTRAINT "coins_pkey" PRIMARY KEY ("id")
)
CREATE TABLE "public"."market_transactions" (
"id" int8 NOT NULL DEFAULT nextval('market_transactions_id_seq'::regclass),
"user_id" int4 NOT NULL DEFAULT NULL,
"quantity" numeric(18,8) NOT NULL DEFAULT NULL,
"market_coin_id" int4 DEFAULT NULL,
CONSTRAINT "market_transactions_pkey" PRIMARY KEY ("id")
)
一个用户有许多涉及硬币的交易(market\u transactions.market\u coin\u id
是coins.id
),我试图对每一笔交易的拥有量(market\u transactions.quantity
)求和,然后将该值乘以以不同货币表示的硬币价格(btc、欧元、美元)
对查询运行解释(即解释选择不同…),查看查询计划是什么。最有可能的是,它只运行了一次窗口函数。如果要多次运行,请尝试添加外部选择:
SELECT DISTINCT
price_btc,
price_eur,
price_usd,
currency_name,
currency_symbol,
holdings * price_eur AS holdings_eur,
holdings * price_usd AS holdings_usd,
holdings * price_btc AS holdings_btc,
holdings
FROM (
SELECT
coins.price_btc,
coins.price_eur,
coins.price_usd,
coins.currency_name,
coins.currency_symbol,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) AS holdings
FROM
market_transactions
INNER JOIN coins ON coins.id = market_transactions.market_coin_id
WHERE
market_transactions.user_id = 1
) src
ORDER BY
currency_symbol
对查询运行解释(即解释选择不同…),查看查询计划是什么。最有可能的是,它只运行了一次窗口函数。如果要多次运行,请尝试添加外部选择:
SELECT DISTINCT
price_btc,
price_eur,
price_usd,
currency_name,
currency_symbol,
holdings * price_eur AS holdings_eur,
holdings * price_usd AS holdings_usd,
holdings * price_btc AS holdings_btc,
holdings
FROM (
SELECT
coins.price_btc,
coins.price_eur,
coins.price_usd,
coins.currency_name,
coins.currency_symbol,
SUM ( market_transactions.quantity ) OVER ( PARTITION BY market_transactions.market_coin_id ) AS holdings
FROM
market_transactions
INNER JOIN coins ON coins.id = market_transactions.market_coin_id
WHERE
market_transactions.user_id = 1
) src
ORDER BY
currency_symbol
我建议在加入之前进行聚合,然后执行以下操作:
SELECT c.*,
mt.quantity * c.price_eur AS holdings_eur,
mt.quantity * c.price_usd AS holdings_usd,
mt.quantity * c.price_btc AS holdings_btc,
mt.quantity * c.market_coin_id AS holdings
FROM coins c JOIN
(SELECT mt.market_coin_id, SUM(mt.quantity) as quantity
FROM market_transactions t
WHERE mt.user_id = 1
GROUP BY mt.market_coin_id
) mt
ON c.id = mt.market_coin_id
ORDER BY c.currency_symbol
我建议在加入之前进行聚合,然后执行以下操作:
SELECT c.*,
mt.quantity * c.price_eur AS holdings_eur,
mt.quantity * c.price_usd AS holdings_usd,
mt.quantity * c.price_btc AS holdings_btc,
mt.quantity * c.market_coin_id AS holdings
FROM coins c JOIN
(SELECT mt.market_coin_id, SUM(mt.quantity) as quantity
FROM market_transactions t
WHERE mt.user_id = 1
GROUP BY mt.market_coin_id
) mt
ON c.id = mt.market_coin_id
ORDER BY c.currency_symbol
请共享表结构、示例数据、预期输出以及查询试图生成的结果的说明。作为一般的经验法则,每当我看到SELECT DISTINCT和Window函数时,我都怀疑查询的逻辑正确性。感谢检查,我添加了简化的表结构,这需要我进行一些插入,但应该很容易。请共享表结构、示例数据、,预期输出和查询试图生成的结果的说明。作为一般的经验法则,每当我看到SELECT DISTINCT和Window函数时,我都会怀疑查询的逻辑正确性。感谢您的检查,我添加了简化的表结构,这会让我花一点时间进行插入,但应该很容易。