代码之家  ›  专栏  ›  技术社区  ›  Noones

同一公司的SQL地址表需要最新联系人

  •  0
  • Noones  · 技术社区  · 6 年前

    我得到了一个包含主要和次要公司位置的地址表,例如:

    地址:

     ID    CompanyName       AdressType    MainID    Location 
    
     1    ExampleCompany        H             0        Germany 
    
     2    ExampleCompany        N             1        Sweden
       
     3    ExampleCompany        N             1         Germany
    

    我们还得到了另一张联系人表,其中包括公司每个地点的最新联系人

    联系人

    ID    SuperID    Datecreate    Notes
    
    1       1        10.04.2018     XY
    
    2       3        09.04.2018     YX
    
    3       2        11.04.2018      XX
    

    现在,我们要为每家公司选择最新的联系人,并对其进行排序,这样我们就可以得到一份长期未联系的所有客户的列表。

    我想到了这样的事情:

    SELECT 
    ADDRH.ID,
    ADDRH.COMPANY1,
    TOPCONT.ID,
    TOPCONT.DATECREATE,
    TOPCONT.NOTES0
    
    FROM dbo.ADDRESSES ADDRH
    OUTER APPLY (SELECT TOP 1 ID, SUPERID, DATECREATE, CREATEDBY, NOTES0 FROM DBO.CONTACTS CONT WHERE ADDRH.ID = CONT.SUPERID ORDER BY DATECREATE DESC) TOPCONT
    WHERE
    TOPCONT.ID IS NOT NULL
    ORDER BY TOPCONT.DATECREATE
    

    但这仍然忽略了一个事实,即我们多次在地址表中找到同一家公司。如何创建一个列表,让每家公司都有最新的联系人?

    谢谢你的帮助

    您好

    1 回复  |  直到 4 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    嗯,您还必须删除地址中的重复项。由于数据的结构,我认为最好的方法是 row_number() :

    SELECT ac.*
    FROM (SELECT a.ID, a.COMPANY1, c.ID, c.DATECREATE, c.NOTES0,
                 ROW_NUMBER() OVER (PARTITION BY a.COMPANY1 ORDER BY c.DATECREATE DESC) as seqnum
          FROM dbo.ADDRESSES a JOIN
               DBO.CONTACTS c
               ON a.ID = c.SUPERID
          WHERE c.ID IS NOT NULL
         ) ac
    WHERE seqnum = 1
    ORDER BY c.DATECREATE;