Sql 如果出现与2相同的值,则更新状态

Sql 如果出现与2相同的值,则更新状态,sql,sql-server,Sql,Sql Server,我有一张像这样的桌子 ID CustId CustName Status 1 a1 A NULL 2 a1 A NULL 3 a2 B NULL 4 a3 B NULL 5 a4 C NULL 6 a4 C NULL 7 a5 D NULL 8 a6 E NULL 当c

我有一张像这样的桌子

ID  CustId  CustName Status
1     a1       A     NULL
2     a1       A     NULL
3     a2       B     NULL
4     a3       B     NULL
5     a4       C     NULL
6     a4       C     NULL
7     a5       D     NULL
8     a6       E     NULL
当custid第二次出现时,我想更新状态=2,我需要如下输出

ID  CustId  CustName Status
1     a1       A     1
2     a1       A     2
3     a2       B     1
4     a3       B     1
5     a4       C     1
6     a4       C     2
7     a4       D     2
8     a6       E     1
现在我使用以下查询来更新状态

update #tablename
set status= 2
where Custid in
(
  select * from
  (
    select Custid 
    from #tablename
    group by Custid 
    having count(*)> 1
  ) a
)
但是当countcustid>1时,上面的查询正在更新status=2 我不想更新第一行

CREATE TABLE #UserCompany
    ([ID] int, [CustId] varchar(2), [CustName] varchar(1), [Status] int)
;

INSERT INTO #UserCompany
    ([ID], [CustId], [CustName], [Status])
VALUES
    (1, 'a1', 'A', null),
    (2, 'a1', 'A', null),
    (3, 'a2', 'B', null),
    (4, 'a3', 'B', null),
    (5, 'a4', 'C', null),
    (6, 'a4', 'C', null),
    (7, 'a4', 'D', null),
    (8, 'a6', 'E', null)
;
select *,row_number() over (partition by [CustId] order by [ID]) as rn from #UserCompany

with cte as 
(
select *,row_number() over (partition by [CustId] order by [ID]) as rn from #UserCompany)
update cte 
set [Status]=case when rn > 1 then 2 else 1 end

简介 解决这个问题的最简单方法是使用子查询

因此,对于每一行,生成一个子查询,只返回一个值。 此子查询基本上将统计该客户id的记录数,这些记录的id>=当前客户id

密码 更新1:仅更新上一个相同cust实例计数>=2的记录 更新2:与更新1相同,但设置2而不是实际计数 同上,但插入2而不是实际计数

UPDATE UserCompany 
SET
      UserCompany.status = temp.insert_status
FROM usercompany AS u
INNER JOIN
  ( SELECT ID,
           CustID,
           CustName,
     2 as insert_status, 
     (SELECT count(*)
      FROM UserCompany t
      WHERE t.custId = u.custId
        AND t.ID <= u.id ) AS status
   FROM UserCompany u ) AS TEMP ON temp.ID = u.ID AND TEMP.STATUS >=2;

   select * from UserCompany;

MySQL或SQL server这两个数据库都使用其他SQL语法请向我们展示您目前拥有的,恐怕这不是一个代码编写服务。我使用的是sql Server,它不接受a的答案,然后在很长一段时间后将其更改为符合您真正需要的答案,也就是说,这个问题使我甚至不愿意看这一个…我只需更新这些custid的可能重复已经发生了超过个月once@Rajasekar巴斯卡,你只想要2分还是2分以上?这是很容易做到的条件。如果它大于2,我们应该指定2吗。。。我给你2-3分examples@RajasekarBaskar更新!
UPDATE UserCompany 
SET
      UserCompany.status = temp.status
FROM usercompany AS u
INNER JOIN
  ( SELECT ID,
           CustID,
           CustName,

     (SELECT count(*)
      FROM UserCompany t
      WHERE t.custId = u.custId
        AND t.ID <= u.id ) AS status
   FROM UserCompany u ) AS TEMP ON temp.ID = u.ID;

   select * from UserCompany;
UPDATE UserCompany 
SET
      UserCompany.status = temp.status
FROM usercompany AS u
INNER JOIN
  ( SELECT ID,
           CustID,
           CustName,

     (SELECT count(*)
      FROM UserCompany t
      WHERE t.custId = u.custId
        AND t.ID <= u.id ) AS status
   FROM UserCompany u ) AS TEMP ON temp.ID = u.ID AND TEMP.STATUS >=2;

   select * from UserCompany;
UPDATE UserCompany 
SET
      UserCompany.status = temp.insert_status
FROM usercompany AS u
INNER JOIN
  ( SELECT ID,
           CustID,
           CustName,
     2 as insert_status, 
     (SELECT count(*)
      FROM UserCompany t
      WHERE t.custId = u.custId
        AND t.ID <= u.id ) AS status
   FROM UserCompany u ) AS TEMP ON temp.ID = u.ID AND TEMP.STATUS >=2;

   select * from UserCompany;