このステートメントは、「グループ処理による」と呼ばれるものを使用しています。ステップを実行する前に、データをbtn wtn resp_ji
で並べ替える必要があります。 。
first.resp_ji
ピースは、現在のbtn/wtnの組み合わせ内でresp_jiの現在の値が初めて表示されるかどうかを確認しています。同様に、last.resp_ji
ピースは、resp_ji
の現在の値が表示されるのが最後かどうかをチェックしています。 現在のbtn/wtnの組み合わせ内。
それをすべてまとめてステートメント:
if not (first.resp_ji and last.resp_ji);
つまり、resp_jiの現在の値がbtn / wtnの現在の組み合わせに対して複数回発生する場合は、レコードを保持します。それ以外の場合は、レコードを破棄します。 if
の動作 そのように使用された場合のステートメントは、暗黙的にレコードを保持/破棄します。
SQLで同等のことを行うには、次のようにします。
- 破棄するすべてのレコードを検索します。
- 元のデータセットからそれらのレコードを破棄します。
だから...
create table rows_to_discard as
select btn, wtn, resp_ji, count(*) as freq
from mytable
group by btn, wtn, resp_ji
having count(*) = 1
create table want as
select a.*
from mytable a
left join rows_to_discard b on b.btn = a.btn
and b.wtn = a.wtn
and b.resp_ji = a.resp_ji
where b.btn is null
編集 :これに相当する単純なSQLはありません。サブクエリの行に番号を付け、その上にロジックを構築することで可能かもしれませんが、それは難しいでしょう。また、使用されているSQLの特定のフレーバーによっても異なる場合があります。