[英]Oracle SQL - join table in one-to-many relationship, but instead of duplicating rows show min/max
假设我有TRADE
表和TRADE_EXECUTION
表。 它们之间的常见链接是TRADE_ID
。
TRADE_EXECUTION
具有所有代理交易,这是最终TRADE
一部分(因此,有关已执行数量,执行时间戳等的信息)。 这意味着对于TRADE
表中的每个条目, TRADE_EXECUTION
可能有多个,一个或没有对应的行。
因此,如果在TRADE_ATTRIBUTES
有多个对应的条目,那么如果执行标准的LEFT JOIN
行,将重复TRADE
行。
而不是重复的行我想在我的显示SELECT
查询列TRADE_ID
, MIN(EXECUTION_TIMESTAMP)
和MAX(EXECUTION_TIMESTAMP)
从每个条目TRADE
表。
因此,如果有5个执行指向一个交易,我想显示它们的最早和最新执行时间戳,并放入一行而不是显示5行。
我还需要记住,TRADE_EXECUTION表非常大(每天添加200k条记录,到目前为止总计约5000万条记录)。
我该如何实现?
一个简单的带有聚合的左联接应该起作用,如:
select
t.trade_id,
MIN(e.EXECUTION_TIMESTAMP) as min_ts,
MAX(e.EXECUTION_TIMESTAMP) as max_ts
from trade t
left join trade_execution e on e.trade_id = t.trade_id
group by t.trade_id
SELECT
TRADE_ID,
MAX(EXECUTION_TIMESTAMP) MAX_TS,
MIN(EXECUTION_TIMESTAMP) MIN_TS
FROM
TRADE
LEFT OUTER JOIN TRADE_EXECUTION
ON TRADE.ID = TRADE_EXECUTION.ID
WHERE /* PUT YOUR WHERE CONDITIONS IF THERE IS*/
GROUP BY TRADE_ID;
请注意,由于表的记录量很大,因此您需要明智地使用where条件。 您需要使用索引列来过滤数据
我怀疑您想要:
select t.*, min_executiontimestamp, max_executiontimestamp
from trade t left join
(select te.trade_id, min(executiontimestamp) as min_executiontimestamp,
max(executiontimestamp) as max_executiontimestamp
from trade_execution te
group by te.trade_id
) te
on te.trade_id = t.trade_id;
这使您可以从trade
选择所有想要的列,而不必麻烦group by
子句。
WITH exec AS
(SELECT TRADE_ID, MIN(TRADE_EXECUTION) MIN_EXEC, MAX(TRADE_EXECUTION) MAX_EXEC
FROM TRADE_EXECUTION
GROUP BY TRADE_ID)
SELECT t.TRADE_ID, e.MIN_EXEC, e.MAX_EXEC
FROM TRADE t LEFT JOIN exec e ON t.TRADE_ID=e.TRADE_ID;
并根据需要添加任意数量的TRADE列,而无需对其进行分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.