繁体   English   中英

Oracle SQL-以一对多关系连接表,但不是重复显示行,而是显示最小/最大

[英]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_IDMIN(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM