Удалить из оператора с помощью агрегатов в предложении HAVING SQL Server 2008
У меня есть таблица, которая выглядит следующим образом:
где то, что должно быть уникальным идентификатором, drg, нет, поэтому я начал с личной задачи по его исправлению. Я мог бы сделать это легко, множество способов, но я пытаюсь сделать что-то по-другому, чтобы изучить некоторые новые методы. То, что нужно удалить из таблицы, – это любая строка, drg которой не уникальна и чья функция eff_date ** меньше ** max eff_date.
Чтобы найти то, что мне нужно, я использовал
- Ошибка преобразования SQL DataType
- Эффективный способ удаления определенных строк набора данных SAS на SQL Server
- Удалить количество записей, заданных количеством записей в таблице.
- Удалить, где один столбец содержит дубликаты
- Удалить с присоединением к нескольким таблицам
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 )
- Несколько внешних ключей и Cascade Delete SQL Server
- Удалите записи из таблицы, где a = b и b = a
- Может ли SQL-запрос «DELETE», за которым следует оператор «WHERE NOT IN», в одной транзакции?
- Проблемы с DELETE в определении триггера
- Удалить строки после дубликата
- УДАЛИТЬ ОТ таблицы ГДЕ «RANK»> 1
- Удалите реестр, если какой-либо столбец имеет значение NULL в SQL Server 2008
- Удаление повторяющейся записи из таблицы - запрос SQL
Это должно работать:
;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
? Я понимаю, что это может быть немного хак-иш, и могут быть более красноречивые решения, но это должно сработать.