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 hstT
和 hstD
中的视图加入。主要 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;
我需要通过 SQLServer 2008 tables hstT
和 hstD
中的视图加入。主要 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;