2017-05-31 59 views
1

我试图通过首先按列1, 对数据进行分组来更新表,我需要: 按列2对数据进行排序 使用顶部填充Column4列3的值(按列2排序) 列1,3,4是varchar,列3是int。 我试图用一个CTE的更新和Top为:使用聚合的分组数据的SQL更新

Update a 
Set a.col4 = c.Best 
From Table1 a, 
(Select Top (1) Col3 as Best, Col1, Col2 
From Table1 
Group By Col1 
Order By Col2 DESC) c 
where a.Col1 = c.Col1 

,但它似乎是从每个组中选择从表中的前值不会。有谁知道这里缺少什么或更简单的方法吗?
开始数据:
Col1中col2的COL3 COL4
unit101 11 unit118 NULL
unit101 13 unit125 NULL
unit101 12 unit135 NULL
unit107 11 unit168 NULL
unit107 10 unit199 NULL

所需的结果:
Col1 Col2 Col3 Col4
unit101 11 unit11 unit125
unit101 13 unit125 uni T125
unit101 12 unit135 unit125
unit107 11 unit168 unit168
unit107 10 unit199 unit168

柱4只需要具有从COL3的值,其中第2栏第是在数据的行的最大值由COL1作为分组。

+0

哟可以提供[MCVE]的结果(http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an- MCVE换什么,似乎对我将要-A-极简单的SQL查询)?如果我们可以看到输入/输出的样本,回答这样的问题更容易。 –

回答

1

使用“排名”来确定“最好的”,并补充说,自己内心的加入。下面是一个工作exampole,并提供您要求

Update a 
Set a.col4 = c.Best 
From Table1 a 
inner join 
(
Select 
    Col3 as Best, 
    Col1, 
    BestRank=RANK()over(partition by Col1 order by Col2 desc) 
From 
    Table1 b 
) c on a.Col1 = c.Col1 and c.BestRank=1 
+0

完美地工作,谢谢! – user8091579

+0

很酷的模式@ user1529235,现在我很好奇我想比较它与CROSS APPLY – hardkoded

0

您可以使用CROSS APPLY

Update a 
Set a.col4 = c.Best 
From Table1 a 
CROSS APPLY (Select Top (1) Col3 as Best, Col1, Col2 
       From Table1 t2 
       where a.Col1 = t2.Col1 
       Order By Col2 DESC) c 
+0

当我运行这个时,我得到一个错误:Table1.Col3在选择列表中无效,因为它不包含在聚合函数或group by子句中。 – user8091579

+0

我修复了问题@ user8091579,但要知道您选择的解决方案比此更快。 – hardkoded

+0

这很好,谢谢。 – user8091579