首页 > 解决方案 > 使用任何最新的 N 个标签获取所有行

问题描述

我需要获取N个最新标签的所有记录,即按时间戳排序。

我设法构建了以下查询来检索最新的 20 个标签。但是,当我尝试加入结果时,“限制”将影响总行数,而不是唯一标签的数量。

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;

所以给定下表...

 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

...对最新的 3 个最新标签的查询应输出以下或类似内容:

 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

标签: sqlpostgresql

解决方案


如果你想要最近的 20 个,重复:

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 ;

如果你想要最近的 20 个没有重复:

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 

推荐阅读