2017-05-31 11 views
1

私は最初のデータの各グループ内でcolumn1の、 によってデータをグループ化することによって、テーブルを更新しようとしている: ソートCOLUMN2によるデータ、 がトップでColumn4を移入column3の値(column2でソート) Columns1,3,4はvarchar、Column3はintです。 私はとしてCTEとトップとの更新を試してみました:SQL更新集約Iする必要が

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 unit118 unit125
unit101 13 unit125 uni COL1によってグループ化されるようCOL 2は、データの行の最大値であるCOL3から値を有するようにT125
unit101 12 unit135 unit125
unit107 11 unit168 unit168
unit107 10 unit199 unit168

列4つのニーズ。

+0

を求めた結果を提供ヨーヨーは[MCVE](http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-を提供することができますmcve-for-what-to-me-to-be-a-very-simple-sql-query)を使用していますか?入力/出力のサンプルを見ることができれば、このような質問に答える方が簡単です。 –

答えて

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

関連する問題