2016-08-08 44 views
0

Ich habe das folgende Problem:
Meine Tabelle sieht so aus.SQL Server - Übertragen/Übernahme nur eines Namens aus Zeilen mit gleichen ID's aber unterschiedlichen Namen

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

Da sie „anders“ Name für die gleiche Firma sind, ich habe gerade beschlossen, die längsten Namen wie der Name meiner Firma zu halten.

Also meine Frage ist. Wie überprüfe ich nach dem längsten und halte gleichzeitig einen Eintrag, z.

ID Name 
    1  Company Limited 
    2  Example Corporation 

Die Tabelle sollte danach so aussehen.

Antwort

4

Sie können dies mit einem ROW_NUMBER() mit einem PARTITION auf der ID und Bestellung durch die LEN() ab:

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

Hinweis: Dadurch werden die Datensätze aus Ihrer Tabelle physisch entfernen, die nicht der längste Eintrag sind. Wenn Sie nicht wollen, physisch, sie zu entfernen, und nur SELECT die längsten Einträge, verwenden Sie die folgende statt:

;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

Vielen Dank! Das habe ich gesucht! " Habe gestern schon darüber nachgedacht. – mgruber

0

Eine weitere Option mit Krawatten ...

select 
top 1 with ties 
id,name 
from 
table 
order by 
row_number() over (partition by id order by len(name))