PARTITION BY duplicated id 和 JOIN with the ID with the least value

PARTITION BY duplicated id and JOIN with the ID with the least value

我需要通过 SQLServer 2008 tables hstThstD 中的视图加入。主要 table 包含有关员工及其 "logins" 的数据(因此与 x 月的 x 员工相关的多条记录),第二个 table 包含基于月份的有关其区域的信息,我需要加入两个 tables 但保留最早的记录作为加入的参考以及与该 ID 关联的其余记录。 所以 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(用户 ID)和 period 的数据,但是正如我提到的,我需要加入另一个 table 基于最早的记录,通过关联 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

您可以为此使用 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;