Join Two Tables with get value AsssetCode from Max Date

Riyn Pratama 41 Reputation points
2021-11-17T05:06:54.427+00:00
I'm trying join Two tables:

KDSCMSCNTRCTD
-----------------
CNTRCTDID | CNTRCTDCOMP | CNTRCTDLNUM |
--------------------------------------
 3221 | NAV     | 207
--------------------------------------



KDSCMSCNTRCTDHIST
----------------------------------------------
CNTRCTDHISTID | CNTRCTDHISTSDATE | CNTRCTDHISTCOMP | CNTRCTDHISTLNUM | CNTRCTDHISTASSCODE |
------------------------------------------------------------------------------------------
  65 |  17-NOV-21 | NAV      | 207           | 00091
------------------------------------------------------------------------------------------
  66 |  20-NOV-21 | NAV      | 207           | 123
------------------------------------------------------------------------------------------

i need only get AssetCode from (max) CNTRCTDHISTSDATE from KDSCMSCNTRCTD Like this:

CNTRCTDID | CNTRCTDCOMP | CNTRCTDLNUM | CNTRCTDHISTASSCODE |
-----------------------------------------------------------
 3221 | NAV     | 207 | 123
-----------------------------------------------------------

select CNTRCTDLNUM as PRODID,
CNTRCTDHISTASSCODE as ASSET  
from KDSCMSCNTRCTD left join KDSCMSCNTRCTDHIST ON CNTRCTDHISTLNUM = CNTRCTDLNUM   
where CNTRCTDLNUM = :CONTRACTCODE and CNTRCTDCOMP = :Company ;
Developer technologies Transact-SQL
SQL Server Other
0 comments No comments
{count} votes

Accepted answer
  1. Viorel 122.5K Reputation points
    2021-11-17T08:06:09.213+00:00

    Try a compact query too:

    select *, 
        CNTRCTDHISTASSCODE = (select top(1) CNTRCTDHISTASSCODE from KDSCMSCNTRCTDHIST where CNTRCTDCOMP = t.CNTRCTDCOMP and CNTRCTDHISTLNUM = t.CNTRCTDLNUM order by CNTRCTDHISTSDATE desc)
    from KDSCMSCNTRCTD t
    where CNTRCTDLNUM = :CONTRACTCODE and CNTRCTDCOMP = :Company
    
    0 comments No comments

3 additional answers

Sort by: Most helpful
  1. Viorel 122.5K Reputation points
    2021-11-17T05:41:32.043+00:00

    Try the approach that uses joins:

    select 
       t.CNTRCTDID, t.CNTRCTDCOMP, t.CNTRCTDLNUM, h.CNTRCTDHISTASSCODE
    from KDSCMSCNTRCTD t
    left join KDSCMSCNTRCTDHIST h ON h.CNTRCTDHISTLNUM = t.CNTRCTDLNUM and h.CNTRCTDHISTCOMP = t.CNTRCTDCOMP
    left join KDSCMSCNTRCTDHIST h2 ON h2.CNTRCTDHISTLNUM = t.CNTRCTDLNUM and h2.CNTRCTDHISTCOMP = t.CNTRCTDCOMP and h2.CNTRCTDHISTSDATE > h.CNTRCTDHISTSDATE
    where t.CNTRCTDLNUM = :CONTRACTCODE and t.CNTRCTDCOMP = :Company
    and h2.CNTRCTDHISTID is null
    

  2. EchoLiu-MSFT 14,621 Reputation points
    2021-11-17T06:14:28.363+00:00

    Hi @Riyn Pratama
    Welcome to the microsoft TSQL Q&A forum!

    Please check:

        CREATE TABLE #KDSCMSCNTRCTD(CNTRCTDID INT,CNTRCTDCOMP VARCHAR(15),CNTRCTDLNUM INT)  
        INSERT INTO #KDSCMSCNTRCTD VALUES(3221,'NAV',207)  
          
        CREATE TABLE #KDSCMSCNTRCTDHIST( CNTRCTDHISTID INT,CNTRCTDHISTSDATE DATE,CNTRCTDHISTCOMP VARCHAR(15),   
         CNTRCTDHISTLNUM INT,CNTRCTDHISTASSCODE VARCHAR(15))  
        INSERT INTO #KDSCMSCNTRCTDHIST VALUES(65,'17-NOV-21','NAV', 207,'00091'),  
           (66,'20-NOV-21','NAV',207,'123')  
          
        SELECT * FROM  #KDSCMSCNTRCTD  
        SELECT * FROM  #KDSCMSCNTRCTDHIST     
          
        ;with cte  
        as(select *,max(CNTRCTDHISTSDATE) over(partition by CNTRCTDID) mm  
        from #KDSCMSCNTRCTD k  
        left join #KDSCMSCNTRCTDHIST  
        ON CNTRCTDHISTLNUM = CNTRCTDLNUM     
        where CNTRCTDLNUM =CNTRCTDHISTLNUM and CNTRCTDCOMP =CNTRCTDHISTCOMP)  
          
        select CNTRCTDID,CNTRCTDCOMP,CNTRCTDLNUM,CNTRCTDHISTASSCODE  
        from cte  
        where CNTRCTDHISTSDATE=mm  
    

    Or:

     select CNTRCTDID,CNTRCTDCOMP,CNTRCTDLNUM,CNTRCTDHISTASSCODE  
     from #KDSCMSCNTRCTD k  
     left join (SELECT *,max(CNTRCTDHISTSDATE) over(order by CNTRCTDHISTCOMP) mm  
     FROM  #KDSCMSCNTRCTDHIST) t  
     ON CNTRCTDHISTLNUM = CNTRCTDLNUM and CNTRCTDLNUM =CNTRCTDHISTLNUM   
     and CNTRCTDCOMP =CNTRCTDHISTCOMP  
     where CNTRCTDHISTSDATE=mm  
    

    Output:
    150051-image.png

    If you have any question, please feel free to let me know.
    If the response is helpful, please click "Accept Answer" and upvote it.

    Regards,
    Echo


    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".
    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


  3. EchoLiu-MSFT 14,621 Reputation points
    2021-11-18T07:48:56.463+00:00

    Hi @Riyn Pratama

    Try:

         CREATE TABLE #KDSCMSCNTRCTD(CNTRCTDID INT,CNTRCTDCOMP VARCHAR(15),CNTRCTDLNUM INT)  
         INSERT INTO #KDSCMSCNTRCTD VALUES(142,'NAV',207),(143,'AAV',208)  
              
         CREATE TABLE #KDSCMSCNTRCTDHIST( CNTRCTDHISTID INT,CNTRCTDHISTSDATE DATE,CNTRCTDHISTCOMP VARCHAR(15),   
          CNTRCTDHISTLNUM INT,CNTRCTDHISTASSCODE VARCHAR(15))  
         INSERT INTO #KDSCMSCNTRCTDHIST VALUES(142,'17-NOV-21','NAV', 207,'00091'),  
            (142,'20-NOV-21','NAV',207,'123'),(143,'20-NOV-21','AAV',208,'123'),  
     (143,'17-NOV-21','AAV',208,'444')  
              
         SELECT * FROM  #KDSCMSCNTRCTD  
         SELECT * FROM  #KDSCMSCNTRCTDHIST   
      
      select CNTRCTDID,CNTRCTDCOMP,CNTRCTDHISTASSCODE  
      from #KDSCMSCNTRCTD k  
      left join (SELECT *,max(CNTRCTDHISTSDATE) over(order by CNTRCTDHISTCOMP) mm  
      FROM  #KDSCMSCNTRCTDHIST) t  
      ON CNTRCTDHISTLNUM = CNTRCTDLNUM and CNTRCTDLNUM =CNTRCTDHISTLNUM   
      and CNTRCTDCOMP =CNTRCTDHISTCOMP  
      where CNTRCTDHISTSDATE=mm  
    

    Output:
    150440-image.png

    Echo


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.