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