SQL Server 比较两列,找出重复项,并选择一个较大的整数(如果另一列中有)

xmd2e60i  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(133)

我尽我所能地表达这个问题,但我知道它可能不是很清楚。
我有下表
| 原始控制器标识|控制器标识|
| - ------| - ------|
| 九零六|九零六|
| 九零五|九零五|
| 九零四|九零四|
| 九零三|九零三|
| 九零二|九零二|
| 九零一|九零一|
| 九百|九百|
| 八九八|八九九|
| 八九八|八九八|
| 八九七|八九七|
| 八九六|八九六|
| 八九五|八九五|
| 八九四|八九四|
| 八九三|八九三|
| 八九二|八九二|
我正在尝试运行一个查询,它将检查original_ctr_id中是否有重复的数字,如果有,则将该数字替换为ctr_id中对应的最高数字。
在上面的示例中,898出现了两次,ctr_id中的最大对应数字是899,因此该表看起来应该相同,但是898根本没有出现,并且将在1行中替换为899。
这只是表的一小部分摘录,作为我尝试做的事情的说明。我尝试过Partition by和Group by,但我不需要ctr_id来聚合,因此据我所知,这不会起作用。
下面是最接近我需要的查询,如果我可以添加一些逻辑来选择ctr_id而不是original_ctr_id(当它较大时),这应该会给出所需的结果。

SELECT 
     original_ctr_id
FROM [MIS].[dbo].[Test]
GROUP BY 
    original_ctr_id
HAVING 
Count(original_ctr_id) >= 1 
ORDER BY original_ctr_id

有人知道这是在正确的轨道上还是有一个优雅的解决方案吗?

unftdfkk

unftdfkk1#

您可能需要一个可更新的CTE,它可以在SQL Server中使用,但在使用T-SQL的其他产品(如SyBase)中可能无法使用:

WITH CTE AS(
    SELECT original_ctr_id,
           ctr_id,
           COUNT(*) OVER (PARTITION BY original_ctr_id) AS originals,
           MAX(ctr_id) OVER (PARTITION BY original_ctr_id) AS max_ctr_id
    FROM dbo.YourTable)
UPDATE CTE
SET ctr_id = max_ctr_id
WHERE ctr_id != max_ctr_id
  AND originals > 1

相关问题