Mssql - Sql Query Issue

Hi,

SELECT
  CNT.EMPLID, CNT.ONTRACT_NUM,CNT.START_DATE, CNT.END_DATE FROM
  PS_CONTRACT CNT
  INNER  JOIN PS_CAATNTFY_TMP TMP ON CNT.EMPLID = TMP.EMPLID
  AND CNT.START_DATE = TMP.START_DATE

-- This yields results like :
1000926      118329      2013-05-01 00:00:00.000      2013-08-30 00:00:00.000
1000926      118330      2013-05-01 00:00:00.000      2014-04-01 00:00:00.000


I want only  the second row where the maximum end-date is 2014-04-01.  Without having to do a second pass of the data in another query, how would I do this as part of the above query.

Any help would be greatly appreciated,

Nigluc
BrockAsked:
Who is Participating?
 
appariConnect With a Mentor Commented:
try like this, this works in sqlserver 2005 or above,

Select   EMPLID, ONTRACT_NUM, START_DATE, END_DATE from (
SELECT
  CNT.EMPLID, CNT.ONTRACT_NUM,CNT.START_DATE, CNT.END_DATE ,
Row_number() over(partition by EMPLID order by END_DATE  desc ) RowID FROM
  PS_CONTRACT CNT
  INNER  JOIN PS_CAATNTFY_TMP TMP ON CNT.EMPLID = TMP.EMPLID
  AND CNT.START_DATE = TMP.START_DATE) A where A.RowID = 1
0
 
DcpKingCommented:
So I gather that you are looking for the record where the end date is the maximum available end date.
Try this:
select  cnt.EMPLID, cnt.ONTRACT_NUM, cnt.START_DATE, cnt.END_DATE
from PS_CONTRACT cnt
inner join PS_CAATNTFY_TMP tmp 
on cnt.EMPLID = tmp.EMPLID
  and cnt.START_DATE = tmp.START_DATE
where cnt.END_DATE = (select max(c.END_DATE) 
                                      from PS_CONTRACT c
                                      inner join PS_CAATNTFY_TMP t
                                      on c.EMPLID = t.EMPLID 
                                         and c.START_DATE = t.START_DATE)

Open in new window

What I've added is a condition demanding that the result rows have an END_DATE equal to the largest END_DATE in the result set.

hth

Mike
0
 
PortletPaulfreelancerCommented:
I'd recommend row_number() if it's available (as appari has done), alternatively I'd go with a joined subquery
SELECT
        CNT.EMPLID
      , CNT.ONTRACT_NUM
      , CNT.START_DATE
      , CNT.END_DATE
FROM PS_CONTRACT CNT
        INNER JOIN (
                    SELECT
                          CNT.EMPLID AS EID, MAX(CNT.END_DATE) as MAX_END_DATE
                    FROM PS_CONTRACT
                   ) AS MX ON CNT.EMPLID = mx.EID AND CNT.END_DATE = MX.MAX_END_DATE
        INNER JOIN PS_CAATNTFY_TMP TMP ON CNT.EMPLID = TMP.EMPLID
                        AND CNT.START_DATE = TMP.START_DATE
;

Open in new window

the disadvantage of any solution based on MAX() is that you might (very rarely) have more than one record matching to that date, but a row_number() solution can only grant the number 1 once within a partition and may also use other fields in the order by as tiebreakers to overcome that should it ever be needed.
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
chaauCommented:
Alternatively you can use TOP 1:

SELECT TOP 1
  CNT.EMPLID, CNT.ONTRACT_NUM,CNT.START_DATE, CNT.END_DATE FROM
  PS_CONTRACT CNT
  INNER  JOIN PS_CAATNTFY_TMP TMP ON CNT.EMPLID = TMP.EMPLID
  AND CNT.START_DATE = TMP.START_DATE
ORDER BY CNT.END_DATE DESC

Open in new window

0
 
PortletPaulfreelancerCommented:
:) yes that too, if only one record is the total required
0
 
BrockAuthor Commented:
As I begin my work day,  I was so happy to find a solution to my problem.  

Thank you to all,

I really appreciate it,

Nigluc
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.