【问题标题】:PARTITION BY duplicated id and JOIN with the ID with the least valuePARTITION BY 重复的 id 和 JOIN 与具有最小值的 ID
【发布时间】:2019-07-09 15:09:09
【问题描述】:

我需要通过 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的所有数据,但正如我提到的,我需要通过关联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】:

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

    【讨论】:

    • 到目前为止数据看起来不错,即使出现问题,我也有解决问题的基础。太感谢了。编辑:第二个查询完成了要求。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多