从相同 table 更新相同数据

Update same data from the same table

我有一个 table 注册了几个 CAR(重复和不重复),所以我打算更新所有重复注册的字段(活动),留下 1 个最近的行。
table 数据示例:

我希望我的数据是这样的:

我尝试编写此代码,但它无法正常工作。因为更新了第一行

    -----create table
 create table dbo.test( id int, CAR varchar(30), ACTIVE int)
    
 insert into dbo.test(id, CAR, ACTIVE)
 values 
 (1, 'AAA-25-35', 0),
 (2, 'LDB-25-35', 0),
 (3, 'LDB-00-35', 0),
 (4, 'LDB-25-35', 0),
 (5, 'LDB-00-35', 0),
 (6, 'LDC-10-10', 0),
 (7, 'LDC-10-10', 0),
 (8, 'LDB-00-35', 0)
    
  select * from dbo.test
    
  ----update table
  WITH CTE AS
  (
      SELECT 
          row_number() over (partition by CAR order by id) as t
          , CAR , ACTIVE
      FROM dbo.test
  )
  update CTE
  SET ACTIVE = 1
  WHERE t=1 
    
  select * from dbo.test

您可以只添加 EXISTS 部分:

-----create table
CREATE TABLE #Test(ID INT, CAR VARCHAR(30), ACTIVE INT)

INSERT INTO #Test(ID, CAR, ACTIVE)
VALUES
(1, 'AAA-25-35', 0),
(2, 'LDB-25-35', 0),
(3, 'LDB-00-35', 0),
(4, 'LDB-25-35', 0),
(5, 'LDB-00-35', 0),
(6, 'LDC-10-10', 0),
(7, 'LDC-10-10', 0),
(8, 'LDB-00-35', 0)


----update table
;WITH CTE AS
(
  SELECT ROW_NUMBER() OVER(PARTITION BY CAR ORDER BY ID) AS t,
         CAR,
         ACTIVE
  FROM #Test
)

UPDATE CTE
SET ACTIVE = 1
WHERE t=1
AND EXISTS (SELECT 1 FROM CTE c WHERE c.CAR = CTE.CAR GROUP BY CAR HAVING COUNT(*) > 1)

SELECT * 
FROM #Test

您可以在查询中使用 count 分析函数,如下所示:

WITH CTE AS
  (
      SELECT 
          row_number() over (partition by CAR order by id) as t
          , count(*) over (partition by car) as cnt
          , CAR , ACTIVE
      FROM dbo.test
  )
  update CTE
  SET ACTIVE = 1
  WHERE t=1 and cnt>1