I have the tables:
tblClients:
+----+-------+
| ID | sName |
+----+-------+
| 22 | User1 |
| 23 | User2 |
+----+-------+
tblKeys:
+----+-------+
| ID | sValue|
+----+-------+
| 1 | Key1 |
| 2 | Key2 |
+----+-------+
tblEntries:
+----+---------------------+-----------+------------+
| ID | datDate | lClientID | lKeyID |
+----+---------------------+-----------+------------+
| 1 | 22.10.2019 22:16:34 | 22 | |
| 2 | 22.10.2019 22:16:34 | 22 | 1 |
| 3 | 22.10.2019 22:16:30 | 23 | |
| 4 | 22.10.2019 22:16:38 | 23 | 1 |
+----+---------------------+-----------+------------+
lClientID and lKeyID (optional) refer to above tables.
I need a SQL query which gives me the list of the users from the tblEntries only with maximum datDate field. Now i used the follwing SQL query:
SELECT DISTINCT tblEntries.lClientId, tblEntries.datDate, tblKeys.sValue
FROM (tblEntries INNER JOIN (SELECT lClientId, MAX(datDate) AS datLastAccess FROM tblEntries GROUP BY lClientId) AS z1 ON (tblEntries.datDate = z1.datLastAccess) AND (tblEntries.lClientId = z1.lClientId)) LEFT JOIN tblKeys ON tblEntries.lKeyId = tblKeys.ID;
The problem i encountered is the datLastAccess can contains the equal values so i get the duplicates with the two different keys. I need only the single entry per lClientID. If there are two items with the same values of datDate and lClientID but with the different lKeyID i need only the last one.
Now i get:
+-----------+---------------------+--------+
| lClientId | datDate | sValue |
+-----------+---------------------+--------+
| 22 | 22.10.2019 22:16:34 | |
| 22 | 22.10.2019 22:16:34 | Key1 |
| 23 | 22.10.2019 22:16:38 | |
+-----------+---------------------+--------+
I don’t need the first row (with empty sValue)
Thanks in advance.
Advertisement
Answer
In MS Access, I would recommend:
select l.lclientId, l.datdate, k.svalue
from tblEntries e inner join
tblKeys k
on e.lkeyId = k.keyId
where l.id = (select top (1) l2.id
from tblEntries l2
where l2.lclientId = l.lclientId
order by l2.datdate desc, l2.id desc
);
Notes:
- You don’t need
tblClients
for this query. - The
where
clause is getting exactly one matching row for each entry per client, because it is comparing on theid
column. - There is no requirement that
id
s increase with the date — although if that is the case, the query can be further simplified.
In addition, the subquery can take advantage of an index on tblEnties(lclientId, datdate desc, id desc)
.