'How do I query most recent record data based on login datetime in SQL
I have two tables to join and show detail of the recent date based on login time. Could you please advise?
Data from table "sessions"
| USERNAME | CLIENT NAME | VERSION | LOGIN TIME |
|---|---|---|---|
| TEST_PROD | TEST_A_1 | 2.1.2 | 7-Mar-22 |
| TEST_PROD | TEST_A_1 | 2.1.1 | 15-FEB-22 |
| TEST_PROD | TEST_B | 3.1.1 | 7-Mar-22 |
| TEST_PROD | TEST_C | 4.1.3 | 27-FEB-22 |
| TEST_PROD | TEST_D | 4.1.5 | 27-FEB-22 |
Data from table "users"
| USERNAME | TASK |
|---|---|
| TEST_PROD | messenger |
| TEST_PROD | messenger |
| TEST_PROD | messenger |
| TEST_PROD | messenger |
| TEST_PROD | messenger |
I executed below SQL query:
select sessions.USERNAME, sessions.clientname as "CLIENT NAME", sessions.version as "VERSION", users.TASK, MAX(sessions.LOGINTIME) as "LOGIN TIME"
FROM users
RIGHT JOIN sessions on users.USERNAME = sessions.USERNAME WHERE sessions.USERNAME = 'TEST_PROD' AND sessions.LOGINTIME >= to_date('15-FEB-22','DD-MON-YY')
GROUP BY sessions.USERNAME, sessions.clientname, sessions.version, users.TASK;
I got below result:
| USERNAME | CLIENT NAME | VERSION | TASK | LOGIN TIME |
|---|---|---|---|---|
| TEST_PROD | TEST_A_1 | 2.1.2 | messenger | 7-Mar-22 |
| TEST_PROD | TEST_A_1 | 2.1.1 | messenger | 15-FEB-22 |
| TEST_PROD | TEST_B | 3.1.1 | messenger | 7-Mar-22 |
| TEST_PROD | TEST_C | 4.1.3 | messenger | 27-FEB-22 |
| TEST_PROD | TEST_D | 4.1.5 | messenger | 27-FEB-22 |
My expectation is below:
| USERNAME | CLIENT NAME | VERSION | TASK | LOGIN TIME |
|---|---|---|---|---|
| TEST_PROD | TEST_A_1 | 2.1.2 | messenger | 7-Mar-22 |
| TEST_PROD | TEST_B | 3.1.1 | messenger | 7-Mar-22 |
| TEST_PROD | TEST_C | 4.1.3 | messenger | 27-FEB-22 |
| TEST_PROD | TEST_D | 4.1.5 | messenger | 27-FEB-22 |
Solution 1:[1]
If I understood correctly what you are attempting to do, you could SELECT DISTINCT ON (username) and ORDER BY LOGINTIME DESC to get your expected results.
select distinct on (sessions.username) sessions.USERNAME, sessions.clientname as "CLIENT NAME", sessions.version as "VERSION", users.TASK, MAX(sessions.LOGINTIME) as "LOGIN TIME"
FROM users
RIGHT JOIN sessions on users.USERNAME = sessions.USERNAME WHERE sessions.USERNAME = 'TEST_PROD' AND sessions.LOGINTIME >= to_date('15-FEB-22','DD-MON-YY')
GROUP BY sessions.USERNAME, sessions.clientname, sessions.version, users.TASK
ORDER BY sessions.LOGINTIME DESC;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Lauri |
