私の目標は、グループ化されたCaseKeyのMAX(recordDate)ではないすべてのレコードをテーブルから削除することです。したがって、3つのケースキーの3つのセットを持つ9つのレコードがあり、各ケースキーには3つの日付があります。各セットの下位2つの日付を削除して、合計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句のいずれにも含まれていないため、選択リストでは無効です。
明らかに、group By句にtableIDを追加することはできますが、そのステートメントの結果は正しくなく、グループ化されたCaseKeysのMAX recordDateを返すだけでなく、すべての行を返します。
サーバーは現在ダウンしていますが、明らかな答えは次のとおりです:(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ステートメントは失敗し、レコードはそれ自体のMAXrecordDateになります。
WildPlasser、私がどういうわけか爆破していたその単純な方法論に感謝します。