我有一个名为trading_orders的大表,其中包含有关用户在交易市场上进行的交易的信息。每个订单都是表中的单独行条目,因此开仓和平仓订单是分开的。为每个条目捕获单独的订单ID,对于平仓交易,名为linked_order_id的列包含相应的开仓order_id。如果订单是开仓订单,则此列包含负 1。
我希望每对未平仓和平仓订单都显示在同一行上,每列都以交易类型(开仓/平仓(为前缀
从初始表中,我可以得到下表:
+------------+-----------------+-------------+-----------+-----------------+
| ORDER_TYPE | ORDER_DIRECTION | TRADE_PRICE | ORDER_ID | LINKED_ORDER_ID |
+------------+-----------------+-------------+-----------+-----------------+
| closing | buy | 1.1234 | O1232 | O2789 |
| opening | sell | 1.1239 | O2789 | -1 |
| closing | sell | 345.9 | O3841 | O1270 |
| closing | sell | 12.55 | O1284 | O8923 |
| opening | buy | 345.8 | O1270 | -1 |
| opening | buy | 12.12 | O8923 | -1 |
+------------+-----------------+-------------+-----------+-----------------+
using this query
SELECT
ORDER_TYPE,
ORDER_DIRECTION,
TRADE_PRICE,
ORDER_ID,
LINKED_ORDER_ID
FROM
trading_orders
从这一点开始,我想使用ORDER_ID和LINKED_ORDER_ID之间的关系将订单配对到一个表中,例如:
+-------------------------+-------------------------+---------------------+---------------------+------------------+------------------+
| OPENING_ORDER_DIRECTION | CLOSING_ORDER_DIRECTION | OPENING_TRADE_PRICE | CLOSING_TRADE_PRICE | OPENING_ORDER_ID | CLOSING_ORDER_ID |
+-------------------------+-------------------------+---------------------+---------------------+------------------+------------------+
| buy | sell | 12.12 | 12.55 | O8923 | O1284 |
| buy | sell | 345.8 | 345.9 | O1270 | O3841 |
| sell | buy | 1.1239 | 1.1234 | O2789 | O1232 |
+-------------------------+-------------------------+---------------------+---------------------+------------------+------------------+
我的第一个想法是将初始查询包装在 WITH 语句中,在 id 上进行某种形式的自连接,但无法确定获取我想要的表的逻辑。 例:
WITH temp_table AS(
SELECT
ORDER_TYPE,
ORDER_DIRECTION,
TRADE_PRICE,
ORDER_ID,
LINKED_ORDER_ID
FROM
trading_orders)
SELECT
...
哪里。。。包含自联接的逻辑。
谁能帮我确定这一点?
您可以自行加入:这个想法是从开仓订单开始(由linked_order_id
中的-1
标识(,然后带上相应的平仓订单,并带有join
:
select
o.order_direction opening_order_direction,
c.order_direction closing_order_direction,
o.trade_price opening_trade_price,
c.trade_price closing_trade_price,
o.order_id opening_order_id,
c.order_id closing_order_id
from trading_orders o
left join trading_orders c
on c.linked_order_id = o.order_id
where o.linked_order_id = -1
另一种解决方案是条件聚合:
select
max(case when linked_order_id = -1 then order_direction end) opening_order_direction,
max(case when linked_order_id <> -1 then order_direction end) closing_order_direction,
max(case when linked_order_id = -1 then trade_price end) opening_trade_price,
max(case when linked_order_id <> -1 then trade_price end) closing_trade_price,
max(case when linked_order_id = -1 then order_id end) opening_order_id,
max(case when linked_order_id <> -1 then order_id end) closing_order_id
from trading_orders
group by case when linked_order_id = -1 then order_id else linked_order_id end
group by
子句动态决定应使用哪一列;然后select
子句从相关行中选取值以将其放入相应的列中。