sql >> データベース >  >> RDS >> Sqlserver

監査テーブル使用時のクエリ ヘルプ

    監査テーブルも 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 つの連続する行が存在することはできません。



    1. PostreSQLに新しい行のみを一括挿入する方法

    2. mysqlネイティブjson関数を使用してネストされたjsonオブジェクトを生成するにはどうすればよいですか?

    3. MySQLデータベース内からのPHP変数の呼び出し

    4. PHP/MySQL-実際のGPS座標から半径500メートルのすべてのアイテムを検索します