【发布时间】:2017-12-09 23:28:09
【问题描述】:
我正在寻找一种方法来避免在查询中执行两次计算,例如:
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_transactions.market_coin_id 是coins.id),我试图将每个交易的拥有数量(market_transactions.quantity)相加,然后将该值乘以表示的硬币价格以不同的货币(btc、eur、usd)
【问题讨论】:
-
请分享表结构、示例数据、预期输出以及查询尝试生成的结果的描述。作为一般经验法则,每当我看到 SELECT DISTINCT 和 Window 函数时,我都会怀疑查询的逻辑正确性。
-
感谢您的检查,我添加了简化的表结构,插入需要一些时间,但应该很容易。
标签: sql postgresql