2016-08-08 4 views
0

私は以下の問題があります。
私のテーブルは次のようになります。SQL Server - 同一IDで異な​​る名前の行から1つの名前のみを転送/採用

ID Name 
    1  Company LTD. 
    1  Company Limited 
    1  Company ltd 
    2  Example Corp. 
    2  Example Corporation 
    ... 

同じ会社の「異なる」名前なので、私はちょうど会社名として最長の名前を保つことに決めました。

私の質問はそうです。最長のものをチェックして、同じ瞬間に1つのエントリだけを保持するにはどうすればいいですか?

ID Name 
    1  Company Limited 
    2  Example Corporation 

表はこれ以降のようになります。

答えて

4

あなたはLEN() DESCでIDと順序にPARTITIONROW_NUMBER()でこれを行うことができます。

;With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By Id Order By Len(Name) Desc) As RN 
    From YourTable 
) 
Delete Cte 
Where RN <> 1 

注:これは、物理的に最長のエントリではありませんあなたのテーブルからレコードを削除します。あなたが物理的にそれらを削除し、のみSELECT最長のエントリは、以下の代わりに使用したくない場合は、次のネクタイと

;With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By Id Order By Len(Name) Desc) As RN 
    From YourTable 
) 
Select Id, Name 
From Cte 
Where RN = 1 
+0

どうもありがとう!これは私が探していたものです! ' 昨日、それについて自分自身で考えました。 – mgruber

0

つ以上のオプションを...

select 
top 1 with ties 
id,name 
from 
table 
order by 
row_number() over (partition by id order by len(name)) 
関連する問題