PARTITION BY重复的id和JOIN与ID值最小的ID

问题描述 投票:1回答:1

我需要通过SQLServer 2008表hstThstD中的视图加入。主表包含有关员工及其“登录”的数据(因此多个记录在x个月内与x员工相关联),第二个表包含基于月份的区域信息,我需要加入两个表但保留最早的记录作为连接的参考和与该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 BUT的所有数据,正如我所提到的,我需要根据最早的记录加入另一个表格,通过关联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
sql sql-server-2008 join view row-number
1个回答
1
投票

您可以使用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;
© www.soinside.com 2019 - 2024. All rights reserved.