Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行GROUP BY并获取聚合函数中未使用的附加列?_Sql_Sql Server - Fatal编程技术网

Sql 执行GROUP BY并获取聚合函数中未使用的附加列?

Sql 执行GROUP BY并获取聚合函数中未使用的附加列?,sql,sql-server,Sql,Sql Server,在下面的代码中,我有两个表。我加入这些,现场执行分组,然后对通过连接计算的值执行最小值 问题是,我还希望获得结果行的Column2的值。目前我无法立即选择此选项,因为Column2不是GROUP BY的一部分,也不是聚合函数的一部分 此外,我无法对数据执行第三次连接以获取此列,因为我将以循环结束,因为我的连接条件将位于DerivedValue上,为了获取此值,我需要生成另一个GROUP BY。。。。。我会绕圈子 如果有助于理解-temp4只是一个包含1和0的表,那么执行一个掩码,因此在这两个数的

在下面的代码中,我有两个表。我加入这些,现场执行分组,然后对通过连接计算的值执行最小值

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

此外,我无法对数据执行第三次连接以获取此列,因为我将以循环结束,因为我的连接条件将位于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

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


否则就做不到。也许可以考虑重新调整你的问题来解决你的确切问题。

< P>从SQL Server 2005中,你可以使用RooSo号在GET上使用同一行的列数据作为最大值或最小值。

像这样的东西可能适合你。在temp3.spot上进行分区,并按计算值排序。这将为最小计算值提供一个1的行号。您需要将整个查询放在派生表或CTE中,因为where子句中不可能使用row_number

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;

这看起来像是一个复杂的查询,可以给出一个简单的结果。您的初始联接将生成每个Spot、Vol对的副本,并且该对的两个值之间存在差异

Spot、Vol对的可能概率仅为0或1,因此您寻求的最小值是这些值差中最小值的0或1倍

Spot Vol对的最小值差必须是该对的minValue-maxValue

下面的简单查询应提供与已发布查询相同的结果。然而,您可能想要完全不同的东西,并且您发布的查询可能是错误的

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;

我认为,如果您只列出已有的表和列名,然后解释结果集应该是什么样子,这会有所帮助。破译您提供的查询让我头疼。@Omtara,这样更好吗?我的意思是,您不用SQL解释每个表中有哪些表和列,然后说您希望在结果集中有哪些列。e、 g.表格:表1有A列、B列,表2有X列、Y列等联接:Table1.columnA=Table2.columnY等../结果:表1.columnA,minTable1.value-Table2.value