I need to get the all the records of the N latest Tags, i.e. ordered by timestamp.
I’ve managed to construct the following query that retrieves the latest 20 tags. However when I try to join on the result, the “limit” will affect the total number of rows, and not the number of unique tags.
x
SELECT id, tag, timestamp
FROM items AS T1
WHERE NOT EXISTS (
SELECT *
FROM items AS T2
WHERE T2.tag = T1.id AND T2.timestamp > T1.timestamp
)
ORDER BY timestamp DESC
LIMIT 20;
So given the following table…
id | tag | timestamp
----+------------+------------
1 | Green | 2019-04-30
2 | Red | 2019-04-29
3 | Blue | 2019-04-28
4 | Green | 2019-04-27
5 | White | 2019-04-26
6 | Red | 2019-04-25
7 | Black | 2019-04-24
8 | Blue | 2019-04-23
9 | Red | 2019-04-22
10 | Black | 2019-04-21
… A query for the lastest 3 latests tags should output the following or similar:
id | tag | timestamp
----+------------+------------
1 | Green | 2019-04-30
4 | Green | 2019-04-27
2 | Red | 2019-04-29
6 | Red | 2019-04-25
9 | Red | 2019-04-22
3 | Blue | 2019-04-28
8 | Blue | 2019-04-23
Advertisement
Answer
If you want the most recent 20, with duplicates:
SELECT id, tag, timestamp
FROM items i
WHERE i.tag IN (SELECT i2.tag
FROM i2
ORDER BY timestamp DESC
FETCH FIRST 20 ROWS ONLY
);
ORDER BY timestamp DESC ;
If you want the most recent 20 without duplicates:
SELECT id, tag, timestamp
FROM items i
WHERE i.tag IN (SELECT i2.tag
FROM i2
GROUP BY i2.tag
ORDER BY MAX(timestamp) DESC
FETCH FIRST 20 ROWS ONLY
);
ORDER BY timestamp DESC