Oracle SQL - объединяйте таблицу в соотношении один-ко-многим, но вместо дублирующих строк показывайте мин / макс - PullRequest
0 голосов
/ 14 декабря 2018

допустим, у меня есть TRADE таблица и TRADE_EXECUTION таблица.Общая связь между ними: TRADE_ID.

TRADE_EXECUTION имеет все исполнения брокера, которые являются частью окончательного TRADE (таким образом, информация о выполненном количестве, метка времени исполнения и т. Д.).Это означает, что для каждой записи в таблице TRADE может быть несколько, одна или нет соответствующих строк в TRADE_EXECUTION.

Так что, если я сделаю стандартные LEFT JOIN, строки из TRADE будут продублированы в случаеЕсть несколько соответствующих записей в TRADE_ATTRIBUTES.

Вместо дублирования строк, которые я хочу показать в моих SELECT столбцах запросов TRADE_ID, MIN(EXECUTION_TIMESTAMP) и MAX(EXECUTION_TIMESTAMP) для каждой записи из таблицы TRADE.

Так что, если есть 5 исполнений, указывающих на одну сделку, я хочу показать из них самую раннюю и последнюю отметку времени исполнения и поместить в одну строку вместо отображения 5 строк.

Мне также нужно сохранитьпомните, что таблица TRADE_EXECUTION довольно большая (ежедневно добавляется 200 тысяч записей, всего около 50 миллионов).

Как мне этого добиться?

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018
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, сколько вам нужно, без их группировки ....

0 голосов
/ 14 декабря 2018
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;

Обратите внимание, что, поскольку ваша таблица имеет очень большой объем записей, вам необходимо разумно использовать условие «где».Вам необходимо отфильтровать данные, используя индексированные столбцы

0 голосов
/ 14 декабря 2018

Я подозреваю, что вы хотите:

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.

0 голосов
/ 14 декабря 2018

Простое левое соединение с агрегацией должно быть выполнено, как в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...