検索

ホームページ  >  に質問  >  本文

MySQLの結合クエリでの計算

いくつかの計算があり、これをクエリで実行したいと考えています。

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 * (20 2) = 44

になります。 2 番目の子の値は 2 * (44 2) = 92 (どちらの子も倍数であり、合計は 2 に等しい) です。 結局、各親の最終値が必要なので、最終的に期待される結果は次のようになります:

リーリー

例を簡単にするために、各親の子テーブルのすべての

multiply

列と sum 列は等しく (異なる値を想定)、最終値は最大値です。毎回最大値になるとは限りません。

P粉726234648P粉726234648284日前503

全員に返信(2)返信します

  • P粉493313067

    P粉4933130672024-02-18 16:22:54

    ROW_NUMBER() ウィンドウ関数を使用して、children の行をランク付けし、parent_id で分割し、id で分割します。 SUM()ウィンドウ関数はソートして目的の合計を取得します。
    最後に、FIRST_VALUE() ウィンドウ関数を使用して、各 ID の最後の合計を取得します。 リーリー

    表示

    デモ

    返事
    0
  • P粉959676410

    P粉9596764102024-02-18 00:50:20

    親が変更されると、途中で値をリセットする必要があるため、少し注意が必要です。

    次のクエリを試してください:

    リーリー

    上記の CASE ステートメントを IF ステートメント (より読みやすく) に置き換えることもできます。 リーリー

    これにより、必要な出力が得られるはずです。

    2 つの変数

    @current_parent_value@running_parent を使用しました。

    @running_parent は、前の行と現在の行が同じ parent に属しているかどうかを判断するのに役立ち、@current_parent_value は現在の行を保存するのに役立ちます。ランニングバリュー。

    返事
    0
  • キャンセル返事