これはいいパズルです。
私のメインのDBMSはTeradataであるため、分析関数を使用してソリューションを作成しました(TD14.10 +が必要):
SELECT dt.*,
-- find the last item in the stack with the same position
Last_Value(val IGNORE NULLS)
Over (PARTITION BY pos
ORDER BY i) AS top_of_stack_val
FROM
(
SELECT st.*,
-- calculate the number of items in the stack
Sum(CASE WHEN op = 'I' THEN 1 ELSE -1 end)
Over (ORDER BY i
ROWS Unbounded Preceding) AS pos
FROM stack_trace AS st
) AS dt;
このソリューションはOracleでも機能しますが、PostgreSQLとSQLServerはIGNORE NULLS
をサポートしていません。 LAST_VALUE
のオプション そして、それをエミュレートすることは非常に複雑です。たとえば、ItzkBen-Ganの
編集:実際、それほど複雑ではありません。Itzikの2番目の解決策である古いピギーバックトリックを忘れました;-)
Martin Smithのアプローチは、4つのDBMSすべてで機能します。