0

在下面的代码中,我有两个表。我加入这些,对“Spot”执行 GROUP BY,然后对通过连接计算的值执行 MIN()。

问题是我还希望为我的结果行获取 Column2 的值。目前我无法立即选择它,因为 Column2 不是 GROUP BY 的一部分,也不是聚合函数的一部分。

此外,我无法对数据执行第三次 JOIN 以获取此列,因为我最终只会绕圈子,因为我的连接条件将在 DerivedValue 上,为了得到这个,我需要生成另一个 GROUP BY。 ....我会绕圈子。

如果它有助于理解- temp4 只是一个包含 1 和 0 的表,执行掩码(因此 MIN() 是在这两个相乘上完成的).....

编辑:请注意,我加入同一张表的原因是因为我有效地从矩阵中减去了两个值,这是在一行中得到正确值的最简单方法。

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

您不能选择 GROUP BY 子句或聚合中不存在的列。原因是无法将多行中的值压缩到一个数据单元格中。例如,如果您将 20 行组合为一个,如何决定在该行的结果中选择哪个值?您应该指示查询选择正确的值,或者对其进行分组,或者以某种方式聚合。

否则无法完成。也许考虑改写您的问题,以获得针对您的确切问题的一些解决方法。

于 2012-05-14T11:26:12.093 回答
0

在 SQL Server 2005 中,您可以使用row_number() over()获取位于同一行的列数据作为最大值或最小值。

像这样的东西可能对你有用。根据您的计算值进行分区temp3.spot和排序。这给你一个row_number1 的最小计算值。您需要将整个查询放在派生表或 CTE 中,因为无法row_number在 where 子句中使用。

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

这看起来像一个复杂的查询来给出一个简单的结果。您的初始连接会生成每个 (Spot,Vol) 对的副本,其中包含该对的两个 Value 值之间的每个差异。

(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 回答