いくつかの計算があり、これをクエリで実行したいと考えています。
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
列は等しく (異なる値を想定)、最終値は最大値です。毎回最大値になるとは限りません。
P粉4933130672024-02-18 16:22:54
ROW_NUMBER()
ウィンドウ関数を使用して、children
の行をランク付けし、parent_id
で分割し、id
と で分割します。 SUM()
ウィンドウ関数はソートして目的の合計を取得します。
最後に、FIRST_VALUE()
ウィンドウ関数を使用して、各 ID の最後の合計を取得します。
リーリー
デモ。
P粉9596764102024-02-18 00:50:20
親が変更されると、途中で値をリセットする必要があるため、少し注意が必要です。
次のクエリを試してください:
リーリー上記の CASE
ステートメントを IF
ステートメント (より読みやすく) に置き換えることもできます。
リーリー
2 つの変数
@current_parent_value と
@running_parent を使用しました。
@running_parent は、前の行と現在の行が同じ
parent に属しているかどうかを判断するのに役立ち、
@current_parent_value は現在の行を保存するのに役立ちます。ランニングバリュー。