いくつかの計算があり、これをクエリで実行したいと考えています。
1 対多の関係を持つ parent テーブルと child テーブルがあります:
リーリー リーリー親の最終値を見つけるには、子を反復処理して次の式を計算する必要があります。
newParentValue = childMultiple(parentValue childSum)
コードでの実装は次のとおりです:
リーリークエリに計算を実装するにはどうすればよいですか?
私はこの方法を試しました (一時変数を使用):
リーリー結合条件 (@value := p.value)
に変数を設定して、新しい親ごとに変数をリセットします。
このクエリは、各親の行と子の数を返します。答えとして各親結合の最後の行が必要です。
しかし、この方法は持続可能ではありません。もっと良い方法はありますか?
###例:### リーリー上記のデータに基づいて、次のような答えが得られると予想します:
リーリーparent.id=1 の場合、3 つの子があり、parent.value は 10 であるため、最初の子の数式を計算した後の新しい値は
1 * (10 1) = 11 になります。いいえ。2 番目の子の値は 1 * (11 1) = 12
です。予想どおり、3 番目の子の値は 1 * (12 1) = 13
です (合計) 3 人の子はすべて倍数であり、合計は 1 に等しくなります)。
parent.id=2 の場合、2 つの子があり、parent.value は 20 であるため、最初の子の数式を計算した後の新しい値は
になります。 2 番目の子の値は 2 * (44 2) = 92
(どちらの子も倍数であり、合計は 2 に等しい) です。
結局、各親の最終値が必要なので、最終的に期待される結果は次のようになります:
例を簡単にするために、各親の子テーブルのすべての
multiply 列と sum
列は等しく (異なる値を想定)、最終値は最大値です。毎回最大値になるとは限りません。
表示ROW_NUMBER()
ウィンドウ関数を使用して、children
の行をランク付けし、parent_id
で分割し、id
とで分割します。 SUM()
ウィンドウ関数はソートして目的の合計を取得します。最後に、
FIRST_VALUE()
ウィンドウ関数を使用して、各 ID の最後の合計を取得します。 リーリーデモ。
親が変更されると、途中で値をリセットする必要があるため、少し注意が必要です。
次のクエリを試してください:
リーリー上記の
これにより、必要な出力が得られるはずです。CASE
ステートメントをIF
ステートメント (より読みやすく) に置き換えることもできます。 リーリー@current_parent_value
と
@running_parentを使用しました。
@running_parent
は、前の行と現在の行が同じ
parentに属しているかどうかを判断するのに役立ち、
@current_parent_valueは現在の行を保存するのに役立ちます。ランニングバリュー。