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

SQLチャレンジ/パズル:スタックトレースが与えられた場合-各時点で最上位の要素を見つける方法は?

    これはいいパズルです。

    私のメインの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の最後の非NULLを参照してください。パズル

    編集:実際、それほど複雑ではありません。Itzikの2番目の解決策である古いピギーバックトリックを忘れました;-)

    Martin Smithのアプローチは、4つのDBMSすべてで機能します。



    1. SQLite MIN

    2. Oracle-スタンドアロンのプロシージャや関数の代わりにパッケージを使用する必要があるのはなぜですか

    3. MySQLの数値にはTOPX(または下)パーセントを選択します

    4. 3つのテーブルを持つJOINおよびGROUP_CONCAT