Как удалить строки после их фильтрации и сортировки?

Как изменить этот запрос так, чтобы он удалял две последние записи о температуре для каждого города, а не только выводил их? Вот сам запрос:

DELETE FROM cities
WHERE (date, city, temperature) IN (
  SELECT date, city, temperature
  FROM (
    SELECT *, row_number() OVER (PARTITION BY city ORDER BY date DESC) as r
    FROM cities
  )
  WHERE r = 1 or r = 2
)
  • 20 октября 2023 г. 14:10
Ответы на вопрос 2
Чтобы удалить строки после их фильтрации и сортировки, можно использовать операцию DELETE с подзапросом. В данном случае подзапрос должен выбрать две последние записи о температуре для каждого города, а затем их удалить из таблицы cities. 

Вот измененный запрос, который удаляет две последние записи о температуре для каждого города:

DELETE FROM cities
WHERE (date, city, temperature) IN (
  SELECT date, city, temperature
  FROM (
    SELECT *, row_number() OVER (PARTITION BY city ORDER BY date DESC) as r
    FROM cities
  )
  WHERE r = 1 or r = 2
)
В однотабличном запросе существует простой способ удалить строки, которые выбирает оператор SELECT. Для этого необходимо заменить ключевое слово SELECT на DELETE и указать имя таблицы в FROM. Если в таблице есть первичный ключ из одного поля, можно использовать подзапрос для ANY и выбрать нужный первичный ключ. Если же у таблицы нет простого первичного ключа, можно воспользоваться подзапросом для EXISTS. Условие WHERE следует переместить в подзапрос, а первую строчку заменить на DELETE.
Похожие вопросы