監査テーブルも lease_period
をログに記録すると仮定します ここで参照される主キー列 lp_id
簡単にするために、次のアプローチを試すことができます:
audit_type
のすべての行を見つけます 'Updated'
です .
すべての行を audit_date
でランク付けします lp_id
で分割します .
audit_date
で行をランク付けします lp_id, suite_id, lease_id, building_id
によるパーティショニング .
2 つのランキングの差を取得します。
<リ>
audit_date
で行を再度ランク付けします lp_id, suite_id, lease_id, building_id, (ranking_difference)
で分割 .
最後のランキング値が 2 以上のすべての行を出力します。
最初の 4 つのステップにより、各グループが連続する行セットが得られます (audit_date
の昇順)。 ) suite_id, lease_id, building_id
の値が同じ行 同じ lp_id
に対して ランキング 2 位と 3 位の差として計算される値によって一意に区別されます。
グループ内では、2 番目の行から始まるすべての行が、前の行とは tenant_trading_name
の値のみが異なります。 、これはまさに私たちが必要としているものです。そのため、取得したばかりの「グループ ID」を考慮して行をもう一度ランク付けし、ランキングが 2 以上のすべての行を返します。
おおよその実装は次のとおりです:
WITH マーク AS ( SELECT *, grp =ROW_NUMBER() OVER (PARTITION BY lp_id ORDER BY audit_date) - ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id ORDER BY audit_date) FROM lease_period_audit WHERE audit_type ='Updated'),ranked AS ( SELECT *, rnk =ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id, grp ORDER BY audit_date) FROM マーク)SELECT audit_date, lp_id, tenant_trading_name, suite_id, lease_id, building_idFROMrankWHERE rnk =2コード> プレ>
ノート。これは、監査テーブルが実際の変更のみをログに記録することを前提としています。つまり、4 つの列すべてが同じ値を持つ、同じ主キーを持つ 2 つの連続する行が存在することはできません。