PARTITION BY с дублированным идентификатором и JOIN с идентификатором с наименьшим значением - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно присоединиться через представление в таблицах SQLServer 2008 hstT и hstD.Основная таблица содержит данные о сотрудниках и их «логинах» (таким образом, несколько записей привязаны к x сотруднику за x месяц), а во второй таблице содержится информация об их области по месяцам, и мне нужно объединить обе таблицы, но вести самую раннюю записьв качестве ссылки для объединения и остальных записей, связанных с этим идентификатором.Так что hstT это что-то вроде:

id id2 period   name
----------------------
x  1   0718     john
x  1   0818     john
y  2   0718     jane

И hstD:

id2 period   area
----------------------
1   0718     sales
1   0818     hr
2   0707     mng

С OUTER JOIN мне удается объединить все данные на основе ID2 (идентификатор пользователя) и period НО, как я уже говорил, мне нужно присоединиться к другой таблице на основе самой ранней записи, выделив ID (которую я мог бы использовать в качестве критерия), чтобы она выглядела так:

id id2 period   name area
---------------------------
x  1   0718     john sales
x  1   0818     john sales
y  2   0718     jane mng

Я знаю, что могу использовать ROW_number, но я не знаю, как использовать его в представлении и присоединиться к нему при следующих условиях:

SELECT     T.*,D.*, ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.PERIOD ASC) AS ORID
FROM         dbo.hstT AS T LEFT OUTER JOIN
                      dbo.hstD AS D ON T.period = D.period AND T.id2 = D.id2
WHERE    ORID = 1
--promps error as orid doesn't exist in any table

1 Ответ

0 голосов
/ 15 февраля 2019

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

select t.*, d.area
from hstT t outer apply
     (select top (1) d.*
      from hstD d
      where d.id2 = t.id2 and d.period <= t.period
      order by d.period asc
     ) d;

На самом деле, если вы просто хотите получить самый ранний период, вы можете отфильтровать и join:

select t.*, d.area
from hstT t left join
     (select d.*, row_number() over (partition by id2 order by period asc) as seqnum
      from hstD d
      order by d.period asc
     ) d;
     on d.id2 = t.id2 and seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...