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.