使用条件检索和计算 MySQL 中的价格

Retrieve and compute prices in MySQL using conditions

我想 retrieve/compute 不同资产在给定日期的价格,具体取决于交易方。 2000 年之前,我有中间报价,之后我有出价和要价或报价,所以我希望价格是这两个报价的平均值。更准确地说:

SELECT date, price,
CASE WHEN side='' THEN 'price_mid'
WHEN side='A' THEN 'price_ask'
WHEN side='B' THEN 'price_bid'
WHEN side='O' THEN 'price_offer'
END as prices 
FROM table
WHERE asset = 'a';

然后如何计算新列中的价格,其中包含 price_mid(2000 年之前)和 (price_bid+price_ask)/2 或 (price_bid+price_offer)/2 之后?

例如:假设我有以下情况:

date    price      prices
1         1       price_mid
2        1.1      price_mid
3        0.9      price_bid
3        1.2      price_ask
4        1.3      price_offer
4        1.1      price_bid

我想要:

date    final_price
 1           1
 2          1.1
 3          1.05
 4          1.2

像这样

SELECT `date`, AVG(price) AS final_price FROM tbl GROUP BY 1

我知道您只需要某些日期的平均值。也许以下内容可以满足您的需求:

SELECT date, AVG(price) as AvgValue
FROM prices
WHERE date >= 2
AND prices in ('price_ask','price_offer','price_bid')
GROUP BY date
UNION
SELECT date, price as AvgValue
FROM prices
WHERE date < 2
AND prices = 'price_mid'
GROUP BY date
UNION
SELECT date, price as AvgValue
FROM prices p
WHERE date >= 2
AND prices = 'price_mid'
AND NOT EXISTS (SELECT 1 FROM prices p2 where p2.date = p.date AND p2.prices in ('price_ask','price_offer','price_bid'))
GROUP BY date
ORDER BY DATE ASC

尝试了一些东西,但没有用,不过也许有帮助..

这是您已有的查询的更改版本,但它不保存一种状态,它只在正确的位置包含所有值。

SELECT 
    date,
    CASE WHEN side = '' THEN price
                        ELSE NULL
    END as price_mid,
    CASE WHEN side = 'A' THEN price
                         ELSE NULL
    END as price_ask,
    CASE WHEN side = 'B' THEN price
                         ELSE NULL
    END as price_bid,
    CASE WHEN side = '' THEN price
                        ELSE NULL
    END as price_offer
FROM 
    table
WHERE 
     asset = 'a';

应该给你什么:

date    price_mid price_ask price_bid price_offer
1         1       NULL      NULL      NULL
2        1.1      NULL      NULL      NULL      
3       NULL      NULL      0.9       NULL
3       NULL       1.2      NULL      NULL
4       NULL      NULL      NULL      1,4
4       NULL      NULL      1.1       NULL

现在 table 你可以检查 IS NULL 或每个日期 SUM()MAX(),这样你就可以在一行中切换你的案例.