Help with SQL Syntax - return all records of last date visited

Without using TOP or ROW_NUMBER()  (because each person has a different record amount of times they visited) how can I return the last date visited.

As of today July 09, 2009 , I would to look back at the last visited date and return all rows of records for their last date of visit.

VisitKey       Date of Service
    11            07/01/2009
    12            07/01/2009
    13            07/01/2009
    14            07/01/2009
    15            07/05/2009
    16            07/05/2009
    17            07/05/2009
Who is Participating?
BrandonGalderisiConnect With a Mentor Commented:
If your date of service does not have the time (datetime field with 00:00:00 time)....

select * from SomeTable
where Date_Of_Service = (select max(Date_Of_Service) from SomeTable)

Open in new window

Kevin CrossChief Technology OfficerCommented:
Why would ROW_NUMBER() not work for you here?  Doesn't matter the number of records, if you ORDER BY date_of_service DESC and take row = 1 then will always be the last visit whether a person has one or a thousand visits.
Kevin CrossChief Technology OfficerCommented:
If a person is represented by a visit key then would look something like this (can replace visit key with proper column for person id to get per person last date of service).
-- without row_number()
SELECT visitkey, max(date_of_service) as lastVisitDate
FROM your_table_name
GROUP BY visitkey;
-- with row_number()
SELECT visitkey, date_of_service as lastVisitDate
   SELECT *, row_number() OVER(PARTITION BY visitkey ORDER BY date_of_service DESC) AS row
   FROM your_table_name
) a
WHERE a.row = 1;

Open in new window

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

It would be nice to see the table structure but letss assume you have a Person_ID, VistitKey, and DateVisited as your columns. To get all records for each person for thier last visit data you can do something like this:
Select  t.*
From   YourTable t INNER JOIN (Select Person_ID, MAX(DateVisited) From YourTable Group by Person_ID) l
             ON t.Person_ID = l.Person_ID
After reading the question again, I believe I misread the requirement.
Kevin CrossConnect With a Mentor Chief Technology OfficerCommented:
And I see now why this didn't make sense to me about row_number().  You want to pull back rows of data, the sample you gave is not finished product... :( I need to read better.

I would do this like Brandon showed or using INNER JOIN; however, slight syntax correction to what P. posted.
FROM your_table_name t
INNER JOIN (SELECT Person_ID, max(Date_Of_Service) AS max_DOS FROM your_table_name GROUP BY Person_ID) l
   ON t.Person_ID = l.Person_ID AND t.Date_Of_Service = l.max_DOS

Open in new window

Kevin CrossChief Technology OfficerCommented:
LOL, it happens!
I still misread what you wrote Brandon.  Thought you nailed it.  Think you are just missing the link on user.
select * 
from SomeTable t1
where Date_Of_Service = (select max(Date_Of_Service) from SomeTable t2 where t2.person_id = t1.person_id)

Open in new window

you can always use dense_rank() instead of row_number().  Dense_Rank will return the same number for duplicate values.

Yes.  That is what I was missing.  I used a subselect instead of a correlated subselect.
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.