Каков наиболее эффективный способ обновления столбца одной таблицы на основе строк другой таблицы? - PullRequest
0 голосов
/ 12 апреля 2020

Предположим, что у нас есть две таблицы, содержащие некоторую информацию об акциях некоторых компаний, как показано ниже:

Таблица 1 (date_price): она состоит из цены каждой отдельной акции каждой компании в разные даты.

| Company_ID |    Date   | Stock_Price  |  Market_Value
_______________________________________________________
    ID_1     |  20190111 |     120      |
    ID_2     |  20190111 |      80      |
    .
    .
    .
    ID_N     |  20200411 |     153      |
    ID_1     |  20200412 |     123      |
    ID_2     |  20200412 |      78      |
    .
    .

Таблица 2 (capital_raises): она состоит из даты всех увеличений капитала всех компаний, а также количества акций каждой компании до и после увеличения капитала.

| Company_ID  |  Raise_Date | Before_Raise_Stocks | After_Raise_Stocks |
________________________________________________________________________
      ID_1    |  20190504   |    300,000,000      |    400,000,000
      ID_3    |  20190812   |    800,000,000      |    900,000,000
      ID_1    |  20191210   |    400,000,000      |    450,000,000
      .
      .
      .

Я хочу обновить столбец Market_Value первой таблицы. Для этого мне нужно умножить цену акции на количество акций компании на эту дату.

Вопрос в том, какой самый эффективный способ сделать это? Это возможно на чистом SQL или мне нужно использовать другую программу?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Для этого вы можете использовать внутренний запрос:

update date_price dp
set Market_Value = dp.Stock_Price * (
    select After_Raise_Stocks
    from capital_raises cr
    where cr.Raise_Date <= dp.Date
    and cr.Company_ID = dp.Company_ID
    order by cr.Raise_Date desc
    limit 1
)
1 голос
/ 12 апреля 2020

Используйте JOIN:

update date_price dp
    set Market_Value = dp.Stock_Price * cr.After_Raise_Stocks
    from (select cr.*,
                 lead(RaiseDate) over (partition by Company_Id order by RaiseDate) as next_RaiseDate
          from capital_raises cr
         ) cr
    where cr.Company_Id = dp.Company_Id and
          dp.date >= cr.RaiseDate and
          (cr.next_RaiseDate is null or dp.date < cr.next_RaiseDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...