テーブル内の識別可能な各レコードごとに最小 5 レコードのみを保持する SQL を作成する必要があります。このために、partition by
返された値が 5 より大きいすべてのレコードを使用して削除します。partition by
ステートメントと同じクエリで WHERE 句を使用しようとすると、「順序付き分析関数は WHERE 句では許可されていません」というエラーが表示されます。したがって、それを機能させるには、3 つのサブクエリを使用する必要があります。私のSQLはこれと同じように見えます:
delete mydb.mytable where (field1,field2) in
(
select field1,field2 from
(
select field1,field2,
Rank() over
(
partition BY field1
order by field1,field2
) n
from mydb.mytable
) x
where n > 5
)
最も内側のサブクエリは生データを返すだけです。そこでは WHERE を使用できないため、サブクエリでラップしました。その目的は、1) WHERE を使用してランクが 5 を超えるレコードを取得し、2) フィールド 1 とフィールド 2 のみを選択することです。これら 2 つのフィールドのみを選択する理由は、最も外側のクエリでこれらのレコードを削除するために IN ステートメントを使用できるようにするためです。
動作しますが、少し面倒です。内側の 2 つのサブクエリを 1 つのサブクエリに統合したいと考えています。これは可能ですか?