@ieromi

Как удалить строки, полученные подзапросом с фильтрацией и сортировкой?

Дана таблица cities=(date, city, temperature)
Нужно удалить из таблицы два последних (по дате) измерения температуры для каждого города одним запросом.
Написал подзапрос select, который выводит нужные строки, но не знаю, как его отредактировать так, чтоб он их удалял.
Сам подзапрос:
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
Когда вставляю его в запрос DELETE - вылетает ошибка
SQL Error [42601]: ОШИБКА: в подзапросе слишком много столбцов
".
В итоге рабочий запрос выглядит так:
DELETE FROM cities WHERE ctid in (
	SELECT ctid FROM (
              SELECT ctid, date, city, temperature, row_number() OVER (PARTITION BY city ORDER BY date DESC) as r 
              FROM cities) as s
	WHERE s.r = 1 or s.r = 2
)
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Как известно, в однотабличном запросе - ровно одна таблица в FROM, без JOIN, подзапросы (в скобках) не в счет - удалить строки, которые выбирает оператор SELECT не просто, а очень просто: достаточно заменить SELECT (со списком полей) на DELETE.
Ваш запрос, начиная со второй строчки, можно преобразовать к такому виду: в FROM указать имя самой таблицы, а отбор строк сделать через подзапрос в разделе WHERE. Если в таблице есть первичный ключ из одного поля, то это делается проще всего через подзапрос для ANY, выбирающий нужный первичный ключ , а в общем случае это делается через подзапрос для EXISTS. Существующее условие WHERE надо перенести в подзапрос. А потом - просто заменить первую строчку на DELETE.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы