Моя цель - удалить все записи из моей таблицы, которые НЕ являются MAX (recordDate) сгруппированного CaseKey. Поэтому, если у меня есть 9 записей с 3 наборами из 3 ключевых слов, и каждый casekey имеет три даты. Я бы удалил две младшие даты каждого набора и придумал 3 общей записи, только MAX (recordDate) каждого из оставшихся.
У меня есть следующий SQL-запрос:
DELETE FROM table
WHERE tableID NOT IN (
SELECT tableID
FROM (
Select MAX(recordDate) As myDate, tableID From table
Group By CaseKey
) As foo
)
Я получаю сообщение об ошибке: Ошибка в строке 3... Столбец "table.tableID" недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Очевидно, я мог бы добавить tableID в мое предложение Group By, но тогда результат этого утверждения неверен и возвращает все строки вместо того, чтобы просто возвращать MAX recordDate из сгруппированных CaseKeys.
Сейчас сервер выключен, но кажущийся ответ: (крошечная настройка из ответа WildPlasser)
DELETE zt FROM ztable zt
WHERE EXISTS (
SELECT * FROM ztable ex
WHERE ex.CaseKey = zt.CaseKey
AND ex.recordDate > zt.recordDate
);
Другими словами, для каждой записи в zt запустите запрос, чтобы увидеть, имеет ли эта же запись запись с более высоким значением recordDate. Если это так, выполняется инструкция WHERE EXISTS и запись удаляется, в противном случае оператор WHERE терпит неудачу, а запись - это собственный MAX recordDate.
Спасибо, WildPlasser, за эту упрощенную методологию, которую я как-то взорвал.