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.
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