PostgreSQL删除分组依据
我有一个PostgreSQL 11数据库。表“book”的快照如下所示。我的真实数据库由每个时间戳200行组成,而不是本例中的4行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
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;