Удалить из оператора с помощью агрегатов в предложении HAVING SQL Server 2008

У меня есть таблица, которая выглядит следующим образом: введите описание изображения здесь

где то, что должно быть уникальным идентификатором, drg, нет, поэтому я начал с личной задачи по его исправлению. Я мог бы сделать это легко, множество способов, но я пытаюсь сделать что-то по-другому, чтобы изучить некоторые новые методы. То, что нужно удалить из таблицы, – это любая строка, drg которой не уникальна и чья функция eff_date ** меньше ** max eff_date.

Чтобы найти то, что мне нужно, я использовал

select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc from drgtable d1 inner join drgtable d2 on d1.drg=d2.drg group by d1.drg,d2.drgdesc having MAX(d1.eff_date) = MAX(d2.eff_date) 

Вместо того, чтобы просто выбрать это в новую таблицу и удалить старый, я хотел бы сделать это в инструкции delete.

Мой процесс, выполненный по странному поиску запроса, заключался в том, чтобы найти строки, которые не были в таблице, из указанного выше запроса, который я использовал, и удалить их. Я подошел, но застрял. Кроме того, если есть более простой способ сделать это, пожалуйста, дайте мне знать. благодаря

– Целью этого было найти строки в d3, которые не были в d4, и удалить их. не совсем понял

 delete from drgtable where ( select * from drgtable as d3 left join ( select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc from drgtable d1 inner join drgtable d2 on d1.drg=d2.drg group by d1.drg,d2.drgdesc having MAX(d1.eff_date) = MAX(d2.eff_date) ) d4 on d4.drg =d3.drg and d4.maxEffDate = d3.eff_date and d3.drgdesc = d4.drgdesc ) 

Это должно работать:

 ;WITH cte As ( SELECT *, MAX(eff_date) OVER(partition by drg) as MaxEffDate FROM drgtable ) DELETE FROM cte WHERE eff_date <> MaxEffDate 

Кроме того, у вас много новых трюков, чтобы вы могли учиться. 🙂

(обратите внимание: это предполагает, что вы находитесь на SQL Server 2005 или выше)

Если я правильно понимаю, вам нужно что-то подобное?

 delete drgtable from drgtable as d1 where exists ( select t.* from drgtable as t where t.drg = d1.drg and t.eff_date > d1.eff_date ) 

Не могли бы вы попробовать:

 delete from drgtable where DRG+MaxEffDate not in (Select drg+maxEffDate as Combo FROM (select d1.drg, MAX(d1.eff_date) as maxEffDate, d2.drgdesc from drgtable d1 inner join drgtable d2 on d1.drg=d2.drg group by d1.drg,d2.drgdesc having MAX(d1.eff_date) = MAX(d2.eff_date) ) as RecordsToKeep ) -- assuming there are no nulls in the data 

? Я понимаю, что это может быть немного хак-иш, и могут быть более красноречивые решения, но это должно сработать.

  • Удаление сервера Sql с помощью известных идентификаторов записей
  • Данные, удаленные с помощью предложения IN, даже если столбец не существует
  • Как удалить записи навсегда в случае связанных таблиц?
  • TSQL Выберите Удалить
  • Как удалить записи NOT IN
  • Удаление дубликатов из таблицы SQL Server
  • Исключить «пропуски» нумерации последовательностей при удалении в SQL Server
  • SQL-сервер: разница между DELETE <Table> и DELETE из <Table>
  • Инкрементное удаление - как это выгодно?
  • Удалить большое количество строк
  • Очистите, удалив все записи старше 180 дней с текущей даты в SQL Server
  • Interesting Posts

    Использование DBNull.Value с SqlParameter без знания sqlDbType?

    OUTER применяется без подзапроса

    Ошибка. Исключительный доступ не может быть получен потому, что база данных используется.

    Производительность хранимой процедуры беспорядочно падает; тривиальный ALTER исправляет это. Зачем?

    Нарушение множественности. Роль «Цель» отношения «имеет множественность 1 или 0..1».

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

    Ошибка переменной T_SQL

    Улучшение производительности SQL

    присоединение к маленькому столу значительно замедляет запрос

    SQL Dependency OnChange вызывает многократные вызовы при восстановлении страницы

    Синхронизация таблиц – действительно ли порядок UPDATE INSERT DELETE имеет значение?

    Близкие совпадения не найдены в СОДЕРЖАНИИ

    Как получить список таблиц и их столбцов в базе данных, которые имеют определенное ключевое слово в своем имени

    Нужно ли указывать ON DELETE NO ACTION на моем внешнем ключе?

    Столбец в Select Select, но я не хочу его в группе

    Давайте будем гением компьютера.