3 つの列を持つテーブルがあるとします。
- イベント ID (PK)
- タグ名
- タグ値
次のような結果になるクエリを作成する必要があります。
- イベントID
- タグ名
- タグ値
- 前の条件タグ
- 前の条件値
PreviousConditionTag/Value は、前の行の TagName および TagValue からのものです (EventID 順の場合)。
この問題の単純なバージョンでは、PreviousConditionTag は常に TagName と同じでした。つまり、現在の TagName の以前の値を取得するだけで済みました。これは、Oracle の LAG 分析関数を使用して解決し、TagName でパーティション分割しました。
ただし、同様のことを実行する必要がありますが、TagName と PreviousConditionTag の関係が 1 対 1 ではない別のテーブルによって、PreviousConditionTag が TagName に関連付けられた任意のタグである場合です。
たとえば、特定の行の TagName が「ABC」の場合、関係テーブルは「IJK」または「XYZ」のいずれかの前の値を検索する必要があると言う場合があります。
同じテーブルに対して SELECT を実行し、条件に一致する MAX(EventID) を探す Oracle 関数でこのロジックを思いつくことができました。例えば:
SELECT * FROM MyTable WHERE EventID = (
SELECT MAX(EventID) FROM MyTable WHERE TagName IN (
SELECT ConditionTagName FROM ConditionMappingTable WHERE TagName = [CurrentTagName]
)
) AND EventID <= [CurrentEventId]
ただし、ご想像のとおり、このクエリは MyTable の行ごとに関数で実行されるため、そのパフォーマンスが気になります。
Oracle の LAG 分析を再度使用する方法を考えようとしていましたが、パーティションが重複しているように見えるため、そのための PARTITION 句を考え出す方法がわかりませんでした。(たとえば、タグ ABC は IJK と XYZ を確認する必要があり、タグ DEF は IJK と UVW を確認する必要があります)
何か案は?