PostgreSQL удалить группу по - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть база данных PostgreSQL 11. Снимок таблицы «книга» ниже. Моя настоящая база данных состоит из 200 строк в метку времени вместо четырех в этом примере.

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

Как я могу удалить строки?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Как насчет использования чего-то подобного тоже?

CREATE TEMPORARY TABLE temp_table(
   ctid int
);

FOR temprow IN
    SELECT distinct(timestamp) from book
LOOP
    SELECT ctid INTO temp_table FROM book where timestamp = temprow ORDER BY ask_price DESC LIMIT 2 
END LOOP;

DELETE FROM book where ctid IN ( select ctid from temp_table);
1 голос
/ 08 апреля 2019

Вы должны использовать что-то вроде 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;
...