PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Запазете само последните 5 резултата от търсене на потребител в таблица

Правилен синтаксис както е описано в ръководството :

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (ORDER BY search_time DESC) AS rn;
    FROM   history_user
    WHERE  user_id = 188
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;

Където pk_id е всяка (комбинация от) колона(и), която е уникална . Може да е user_id , search_time във вашия случай - или, по-удобно, сурогатен първичен ключ.

Само за едница user_id можете да опростите до:

DELETE FROM history_user h
USING (
    SELECT pk_id
    FROM   history_user
    WHERE  user_id = 188
    ORDER  BY search_time DESC
    OFFSET 5
    ) sub
WHERE h.pk_id = sub.pk_id;

От друга страна, за справяне с многота потребители наведнъж, трябва да добавите PARTITION BY към вашата функция за прозорец:

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (PARTITION BY user_id
                                     ORDER BY search_time DESC) AS rn;
    FROM   history_user
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Междусървърна заявка на PostgreSQL?

  2. Импортиране на CSV данни в приложението Rails, като се използва нещо различно от идентификатора на асоциацията

  3. Docker-compose зависи от това да не се изчаква, докато зависимата от услугата не се стартира напълно

  4. Docker compose postgresql услуга - не може да създаде потребител и база данни по време на изграждане?

  5. Надграждане от PostGIS 2.1:Грешка:опит за предефиниране на параметър postgis.backend