简体   繁体   中英

Get record with the last date/time

I have this table layout. I want to get the record for 'USER1' with the latest date/time stamp.

comments_sk case_sk comments    create_user_id  create_date
1           68200   test 1        USER1           2/11/17 11:00
1           68200   test 2        USER1           2/4/17 14:54
1           68200   test 3        USER2           12/30/16 12:37
1           8200    test 4        USER2           12/14/16 14:23
1           68200   test 5        USER3           12/13/16 9:16
1           68200   test 6        USER2           12/8/16 10:38
1           68200   test 7        USER3           12/2/16 10:58
1           68200   test 8        USER2           12/1/16 11:21
1           68200   test 9        USER2           11/8/16 13:36

I have tried these queries but all records for USER1 are showing.

SELECT DISTINCT comments_sk, case_sk, CAST(comments AS varchar) AS comments, create_user_id, create_date
FROM         comments AS s
WHERE     (s.case_sk = 68200) AND (s.create_user_id = 'USER1') AND (s.create_date =
                          (SELECT     MAX(s1.create_date) AS cdate
                            FROM          comments AS s1
                            WHERE      (s1.comments_sk = s.comments_sk)))
GROUP BY comments_sk, case_sk, CAST(comments AS varchar), create_user_id, create_date
ORDER BY create_date DESC
SELECT     s.comments_sk, s.case_sk, max(CAST(s.comments AS varchar)) AS comments, s.create_user_id, s.create_date
FROM         comments AS s INNER JOIN
                          (SELECT    comments_sk, case_sk, max(CAST(comments AS varchar)) AS comments, create_user_id, MAX(create_date) AS cdate
                            FROM          comments
                            GROUP BY comments_sk, case_sk, CAST(comments AS varchar), create_user_id, maint_user_id, maint_date, comment_type_sk) AS s1 ON 
                      s.case_sk = s1.case_sk AND s.create_date = s1.cdate
WHERE     (s.case_sk = 68200)
GROUP BY s.comments_sk, s.case_sk, CAST(s.comments AS varchar), s.create_user_id, s.create_date, s.comment_type_sk
HAVING      (s.create_user_id = 'USER1')
ORDER BY s.create_date DESC
SELECT     comments_sk, case_sk, CAST(comments AS varchar) AS comments, create_user_id, max(create_date)
FROM         comments AS s
WHERE     EXISTS
                          (SELECT     comments_sk, case_sk, CAST(comments AS varchar) AS comments, create_user_id, MAX(create_date) AS cdate
                            FROM          comments AS s1
                            WHERE      (s1.case_sk = s.case_sk) AND (s1.comments_sk = s.comments_sk)
                            GROUP BY comments_sk, case_sk, CAST(comments AS varchar), create_user_id, maint_user_id, maint_date, comment_type_sk
                            HAVING      (s.create_date = MAX(s1.create_date))) AND (s.create_user_id = 'USER1') AND (s.case_sk = 68200)
GROUP BY comments_sk, case_sk, CAST(comments AS varchar), create_user_id, create_date, comment_type_sk
ORDER BY create_date DESC

Using the 'Top 1' and descending order, you should be able to get what you want. Try this:

SELECT top 1 comments_sk, case_sk, CAST(comments AS varchar) AS comments, create_user_id, create_date
FROM         comments AS s
WHERE     (s.case_sk = 68200) AND (s.create_user_id = 'USER1') 
GROUP BY comments_sk, case_sk, CAST(comments AS varchar), create_user_id, create_date
ORDER BY create_date DESC

UPDATE

Based on your comment, I am suggesting that you use a CTE to get the latest comment for a user and then link it to the comments table to get the actual comment. This is an example of how the query can be written. Most probably you want to modify the WHERE clause and use parameters instead of the hard coded values:

; with _cte as (
    SELECT DISTINCT comments_sk, case_sk, create_user_id, Max(create_date) as lastCommentDate
    FROM         comments AS s
    WHERE     s.create_user_id = 'USER1'
    GROUP BY comments_sk, case_sk, create_user_id
)

SELECT  _cte.comments_sk, _cte.case_sk, CAST(comments AS varchar) AS comments, _cte.create_user_id, _cte.lastCommentDate
FROM    comments AS s
        inner join _cte on s.create_date = _cte.lastCommentDate and s.create_user_id = _cte.create_user_id and s.case_sk = _cte.case_sk
WHERE     (s.case_sk = 68200) AND (s.create_user_id = 'USER1') 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM