0

以下のコードには、2 つのテーブルがあります。これらを結合し、「スポット」で GROUP BY を実行してから、結合によって計算された値で MIN() を実行します。

問題は、結果の行の Column2 の値も取得したいということです。Column2 は GROUP BY の一部ではなく、集計関数の一部でもないため、現時点ではこれをすぐに選択することはできません。

また、この列を取得するためにデータに対して 3 番目の JOIN を実行することはできません。これは、結合条件が DerivedValue にあるため、円を描くことになるためです。これを取得するには、別の GROUP BY を生成する必要があります。 ……と、グルグル回っていきます。

理解するのに役立つ場合-temp4は1と0を含む単なるテーブルであり、マスクを実行します(したがって、MIN()はこれら2つの乗算で行われます).....

編集:同じテーブルに参加している理由は、マトリックスから2つの値を効果的に減算しているためであり、1行で正しい値をすべて減算する最も簡単な方法であったことに注意してください。

SELECT temp3.Column1, min(temp3.DerivedValue * Probability) FROM
    (SELECT temp1.Spot AS Spot, temp1.Vol AS Vol, temp1.Value- temp2.Value AS DerivedValue FROM
        (SELECT Spot, Vol, Value FROM My_Table_1) temp1
    INNER JOIN
        (SELECT Spot, Vol, Value FROM My_Table_1) temp2
    ON temp1.Spot = temp2.Spot) temp3
JOIN
    (SELECT Spot, Vol, Probability FROM My_Table_2) temp4
ON temp3.Spot = temp4.Spot AND temp3.Vol = temp4.Vol
GROUP BY temp3.Spot
4

3 に答える 3

0

SQL Server 2005からrow_number() over()は、最大値または最小値と同じ行にある列データの取得を使用できます。

このような何かがあなたのために働くかもしれません。パーティションを作成しtemp3.spot、計算値で並べ替えます。これrow_numberにより、最小計算値のaが1になります。row_numberwhere句では使用できないため、クエリ全体を派生テーブルまたはCTEに配置する必要があります。

WITH C AS
(
  SELECT temp3.Spot,
         temp3.DerivedValue * temp4.Probability AS DerivedValue_Probability,
         ROW_NUMBER() OVER(PARTITION BY temp3.spot ORDER BY temp3.DerivedValue * temp4.Probability) as RN
  FROM   (SELECT temp1.Spot                AS Spot,
                 temp1.Vol                 AS Vol,
                 temp1.Value - temp2.Value AS DerivedValue
          FROM   (SELECT Spot,
                         Vol,
                         Value
                  FROM   My_Table_1) temp1
                 INNER JOIN (SELECT Spot,
                                    Vol,
                                    Value
                             FROM   My_Table_1) temp2
                   ON temp1.Spot = temp2.Spot) temp3
         JOIN (SELECT Spot,
                      Vol,
                      Probability
               FROM   My_Table_2) temp4
           ON temp3.Spot = temp4.Spot
              AND temp3.Vol = temp4.Vol
)
SELECT Spot,
       DerivedValue_Probability
FROM C
WHERE RN = 1;
于 2012-05-14T11:39:08.280 に答える
0

GROUP BY 句または集計のいずれにも存在しない列を選択することはできません。その理由は、複数の行の値を 1 つのデータ セルに圧縮する方法がないためです。たとえば、20 行を 1 つにグループ化する場合、この行の結果に選択する値を決定する方法は? グループ化するか、何らかの方法で集計して、正しい値を選択するようにクエリに指示する必要があります。

そうでなければ、それはできません。正確な問題の回避策を得るために、質問を言い換えることを検討してください。

于 2012-05-14T11:26:12.093 に答える
0

これは、単純な結果を返すための複雑なクエリのように見えます。最初の結合により、各 (Spot,Vol) ペアのコピーが生成され、そのペアの 2 つの値の値がすべて異なります。

(Spot,Vol) ペアの可能な確率は 0 または 1 のみであるため、求められる最小値は、これらの値の差の最小値の 0 または 1 倍になります。

(Spot,Vol) ペアの値の差の最小値は、必ずそのペアの min(Value) - max(Value) です。

以下の単純なクエリは、投稿されたクエリと同じ結果を返すはずです。ただし、まったく別のものが必要になる可能性があり、投稿されたクエリが間違っている可能性があります。

select
  V.Spot, V.Vol, min(P.Probability)*(min(V.Value)-max(V.Value)) as minDVtimesProb
from My_Table_1 as V
join My_Table_2 as P
on P.Spot = V.Spot
and P.Vol = V.Vol
group by V.Spot, V.Vol;
于 2012-05-14T15:15:39.080 に答える