Присоединиться к созданной таблице при условии - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю код для объединения двух разных таблиц при определенных условиях. Таблицы выглядят так

(TABLE 2)
date | deal_code | originator   | servicer | random |
-----------------------------------------------------
2011 |    001    | commerzbank  |   SPV1   |  1     |
2012 |    001    | commerzbank  |   SPV1   |  12    |
2013 |    001    | commerzbank  |   SPV1   |  7     |
2013 |    005    | unicredit    |   SPV2   |  7     |

и еще один стол

(TABLE 1)
date | deal_code | amount |
---------------------------
2011 |    001    | 100    |
2012 |    001    | 100    |
2013 |    001    | 100    |
2013 |    005    | 200    |

Я бы хотел, чтобы это был конечный результат

date | deal_code | amount | originator   | servicer | random |
--------------------------------------------------------------
2013 |    001    | 100    | commerzbank  |   SPV1   |  7     |
2013 |    005    | 200    | unicredit    |   SPV2   |  7     |

Я создал следующий код

select q1.deal_code, q1.date
from table1 q1  
where q1.date = (SELECT MAX(t4.date)
             FROM table1 t4 
             WHERE t4.deal_code = q1.deal_code)

что дает мне:

(TABLE 3)
date | deal_code | amount |
---------------------------
2013 |    001    | 100    |
2013 |    005    | 200    |

Это последнее наблюдение для таблицы 1, теперь я хотел бы, чтобы информация об отправителе и обслужителе была указана с кодом сделки и датой. Любое предложение? Я надеюсь, что было достаточно ясно. Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Похоже, это будет работать:

DECLARE @MaxYear INT;

SELECT @MaxYear = MAX(date)
FROM table1 AS t1
    INNER JOIN table2 AS t2
        ON t1.deal_code = t2.deal_code;

SELECT t1.date,
       t1.deal_code,
       t1.amount,
       t2.originator,
       t2.servicer,
       t2.random
FROM table1 AS t1
    INNER JOIN table2 AS t2
        ON t1.date = @MaxYear
           AND t1.deal_code = t2.deal_code;
0 голосов
/ 10 апреля 2019

Я согласен с Шоном Ланге по поводу названия столбца date.Его метод позволяет обойти зависимость от коррелированного подзапроса, но, в сущности, вам просто нужно добавить INNER JOIN к существующему запросу, чтобы получить столбец amount в наборе результатов.

select 
  q2.date,
  q2.deal_code, 
  q1.amount,
  q2.originator,    
  q2.servicer,  
  q2.random
from 
  table1 q1  
  join
  table2 q2
    on q1.date = q2.date
    and q1.deal_code = q2.deal_code
where q1.date = (SELECT MAX(t4.date)
             FROM table1 t4 
             WHERE t4.deal_code = q1.deal_code)
0 голосов
/ 10 апреля 2019

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

declare @Something table
(
    SomeDate int
    , deal_code char(3)
    , originator varchar(20)
    , servicer char(4)
    , random int
)

insert @Something values
(2011, '001', 'commerzbank', 'SPV1', 1)
, (2012, '001', 'commerzbank', 'SPV1', 12)
, (2013, '001', 'commerzbank', 'SPV1', 7)
, (2013, '005', 'unicredit  ', 'SPV2', 7)

declare @SomethingElse table
(
    SomeDate int
    , deal_code char(3)
    , amount int
)

insert @SomethingElse values
(2011, '001', '100')
, (2012, '001', '100')
, (2013, '001', '100')
, (2013, '005', '200')

select x.SomeDate
    , x.deal_code
    , x.originator
    , x.servicer
    , x.random
    , x.amount
from
(
    select s.SomeDate
        , s.deal_code
        , s.originator
        , s.servicer
        , s.random
        , se.amount
        , RowNum = ROW_NUMBER()over(partition by s.deal_code order by s.SomeDate desc)
    from @Something s
    join @SomethingElse se on se.SomeDate = s.SomeDate and se.deal_code = s.deal_code
) x
where x.RowNum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...