SQL 服务器 - 传输/仅采用 ID 相同但名称不同的行中的一个名称
SQL Server - Transfering / Adopting only one name from Rows with same ID´s but different names
我有以下问题:
我的 table 看起来像这样。
ID Name
1 Company LTD.
1 Company Limited
1 Company ltd
2 Example Corp.
2 Example Corporation
...
因为它们是同一家公司的 "different" 个名称,所以我决定保留最长的名称作为我的公司名称。
所以我的问题是。如何检查最长的一个,同时只保留一个条目,例如
ID Name
1 Company Limited
2 Example Corporation
之后的 table 应该是这样的。
您可以使用 ROW_NUMBER()
和 ID
上的 PARTITION
并按 LEN()
desc:
进行排序
;With Cte As
(
Select *,
Row_Number() Over (Partition By Id Order By Len(Name) Desc) As RN
From YourTable
)
Delete Cte
Where RN <> 1
注意:这将从您的 table 中物理删除不是最长条目的记录。如果您不想物理删除它们,并且只删除 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
Ties 的另一种选择...
select
top 1 with ties
id,name
from
table
order by
row_number() over (partition by id order by len(name))
我有以下问题:
我的 table 看起来像这样。
ID Name
1 Company LTD.
1 Company Limited
1 Company ltd
2 Example Corp.
2 Example Corporation
...
因为它们是同一家公司的 "different" 个名称,所以我决定保留最长的名称作为我的公司名称。
所以我的问题是。如何检查最长的一个,同时只保留一个条目,例如
ID Name
1 Company Limited
2 Example Corporation
之后的 table 应该是这样的。
您可以使用 ROW_NUMBER()
和 ID
上的 PARTITION
并按 LEN()
desc:
;With Cte As
(
Select *,
Row_Number() Over (Partition By Id Order By Len(Name) Desc) As RN
From YourTable
)
Delete Cte
Where RN <> 1
注意:这将从您的 table 中物理删除不是最长条目的记录。如果您不想物理删除它们,并且只删除 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
Ties 的另一种选择...
select
top 1 with ties
id,name
from
table
order by
row_number() over (partition by id order by len(name))