Как мне присоединиться к разреженной таблице и заполнить строки в SQL Server - PullRequest
0 голосов
/ 10 февраля 2020

Как я могу применить веса от одной таблицы к другой [Port], где таблица weight имеет разреженные даты?

[Port] таблица

    utcDT                   UsdPnl
   -----------------------------------------------
    2012-03-09 00:00:00.000 -0.00581815226439161
    2012-03-11 00:00:00.000 -0.000535272460588547
    2012-03-12 00:00:00.000 -0.00353079778650661
    2012-03-13 00:00:00.000 0.00232882689252497
    2012-03-14 00:00:00.000 -0.0102592811199384
    2012-03-15 00:00:00.000 0.00254451559598693
    2012-03-16 00:00:00.000 0.0146718613139845
    2012-03-18 00:00:00.000 0.000425144543842752
    2012-03-19 00:00:00.000 -0.00388548271428044
    2012-03-20 00:00:00.000 -0.00662423680184768
    2012-03-21 00:00:00.000 0.00405506208635343
    2012-03-22 00:00:00.000 -0.000814822806982203
    2012-03-23 00:00:00.000 -0.00289523953346103
    2012-03-25 00:00:00.000 0.00204150859774465
    2012-03-26 00:00:00.000 -0.00641635182718787
    2012-03-27 00:00:00.000 -0.00107168420738448
    2012-03-28 00:00:00.000 0.00131000520696153
    2012-03-29 00:00:00.000 0.0008223678402638
    2012-03-30 00:00:00.000 -0.00255345945390133
    2012-04-01 00:00:00.000 -0.00337792814650089

[Weights] таблица

utcDT                     Weight
--------------------------------
2012-03-09 00:00:00.000     1
2012-03-20 00:00:00.000     3
2012-03-29 00:00:00.000     7

Итак, я хочу использовать веса, как если бы у меня была полная таблица, как показано ниже , то есть изменение на новый вес в первый день, оно появляется в таблице [Веса]:

    utcDT                   UsedWeight   
    ----------------------------------
    2012-03-09 00:00:00.000     1
    2012-03-11 00:00:00.000     1
    2012-03-12 00:00:00.000     1
    2012-03-13 00:00:00.000     1
    2012-03-14 00:00:00.000     1
    2012-03-15 00:00:00.000     1
    2012-03-16 00:00:00.000     1
    2012-03-18 00:00:00.000     1
    2012-03-19 00:00:00.000     1
    2012-03-20 00:00:00.000     3
    2012-03-21 00:00:00.000     3
    2012-03-22 00:00:00.000     3
    2012-03-23 00:00:00.000     3
    2012-03-25 00:00:00.000     3
    2012-03-26 00:00:00.000     3
    2012-03-27 00:00:00.000     3
    2012-03-28 00:00:00.000     3
    2012-03-29 00:00:00.000     7
    2012-03-30 00:00:00.000     7
    2012-04-01 00:00:00.000     7

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вы можете использовать apply:

select p.*, w.*
from port p outer apply
     (select top (1) w.*
      from weights w
      where w.utcDT <= p.utcDT
      order by w.utcDT desc
     ) w;

outer apply обычно довольно эффективно, если у вас есть правильные индексы. В этом случае правильная ссылка на weights(utcDT desc).

0 голосов
/ 10 февраля 2020

Вы можете использовать lead() в подзапросе, чтобы связать следующую дату, когда вес изменяется для каждой weights записи, а затем присоединиться к port, используя условие неравенства для дат:

select p.utcDt, w.weight
from port p
inner join (
    select utcDt, weight, lead(utcDt) over(order by utcDt) lead_utcDt from weights
) w 
    on p.utcDt >= w.utcDt 
    and (w.lead_utcDt is null or p.utcDt < w.lead_utcDt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...