PostgreSQL删除分组依据

PostgreSQL删除分组依据,postgresql,sql-delete,Postgresql,Sql Delete,我有一个PostgreSQL 11数据库。表“book”的快照如下所示。我的真实数据库由每个时间戳200行组成,而不是本例中的4行 timestamp ask_price bid_price 18:00 5 4 18:00 6 3 18:00 7 2 18:00 8 1 19:00

我有一个PostgreSQL 11数据库。表“book”的快照如下所示。我的真实数据库由每个时间戳200行组成,而不是本例中的4行

timestamp  ask_price     bid_price
18:00       5                4
18:00       6                3              
18:00       7                2
18:00       8                1
19:00       6                5 
19:00       7                4
19:00       8                3
19:00       9                2
我想删除除每个时间戳的前两行之外的所有内容,以减小数据库的大小。结果应该如下所示:

timestamp  ask_price     bid_price
18:00       5                4
18:00       6                3              
19:00       6                5 
19:00       7                4
我尝试了以下查询:

DELETE FROM book 
WHERE ctid IN (
SELECT ctid FROM book 
GROUP BY timestamp 
ORDER BY ask_price DESC LIMIT 2)
但是,这将返回以下错误:

ctid must appear in the GROUP BY clause or be used in an aggregate function

如何删除行?

您应该使用类似于ROW_NUMBER的方法将每个时间戳的前两行与其余行隔离开来。我们可以尝试以下方法:

DELETE
FROM book b1
USING (
    SELECT ctid,
        ROW_NUMBER() OVER (PARTITION BY timestamp ORDER BY ask_price DESC) rn
    FROM book
) b2
WHERE
    b1.ctid = b2.ctid AND
    b2.rn > 2;

也使用类似的东西怎么样

创建临时表temp_TABLE ctid int ; 为坦普罗 从书本中选择distincttimestamp 环 从书中选择ctid进入临时表格,其中timestamp=temprow ORDER BY ask_price DESC LIMIT 2 端环; 从目录中删除ctid,从临时表中选择ctid;