Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询中重用分区上的和返回值_Sql_Postgresql - Fatal编程技术网

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函数时,我都会怀疑查询的逻辑正确性。感谢您的检查,我添加了简化的表结构,这会让我花一点时间进行插入,但应该很容易。