Sql 基于同一表中特定记录的计数更新表

Sql 基于同一表中特定记录的计数更新表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用Microsoft SQL Server,我的数据库中有一个如下表: Id groupName flag type -------------------------------- 1 aaa 0 0 2 aaa 1 0 3 aaa 0 0 4 bbb 0 0 5 bbb 0

我正在使用Microsoft SQL Server,我的数据库中有一个如下表:

Id   groupName    flag    type 
--------------------------------
1    aaa          0        0   
2    aaa          1        0 
3    aaa          0        0 
4    bbb          0        0   
5    bbb          0        0 
6    bbb          0        0 
我想根据同一个表中特定记录的计数来更新类型列的值

假设记录按其groupName分组,如果组中至少有一条记录的标志为1,则同一组中所有记录的TypeValue应为1,否则为0

在我的例子中,我希望得到以下输出

Id   groupName    flag    type 
--------------------------------
1    aaa          0        1   
2    aaa          1        1 
3    aaa          0        1 
4    bbb          0        0   
5    bbb          0        0 
6    bbb          0        0 
如何使用SQL语句实现这一点

编辑

当然,下面的方法行不通

UPDATE t1 
SET type = CASE
              WHEN ((SELECT COUNT(*) FROM tg) > 0) 
                 THEN 1 
                 ELSE 0 
           END 
FROM [sampleDB].[dbo].[groups] t1 
JOIN (SELECT t2.groupName, t2.flag 
      FROM [sampleDB].[dbo].[groups] t2) tg ON tg.groupName = t1.groupName 
                                            AND tg.flag = 1;

这是使用exists语句解决此问题最有效的方法:

update t1
set type = 1
from table t1
where exists ( select 1 
               from table t2 
               where t1.groupname = t2.groupname 
               and flag = 1
              )

这是使用exists语句解决此问题最有效的方法:

update t1
set type = 1
from table t1
where exists ( select 1 
               from table t2 
               where t1.groupname = t2.groupname 
               and flag = 1
              )

你可以试试下面的方法-

UPDATE t
SET
    type = case when cnt>=1 then 1 else 0 end
FROM 
    tablename t
    INNER JOIN (select group_name, count(case when flag=1 then 1 end) as cnt from tablename 
                group by group_name)t1
        ON t.group_name= t1.group_name

你可以试试下面的方法-

UPDATE t
SET
    type = case when cnt>=1 then 1 else 0 end
FROM 
    tablename t
    INNER JOIN (select group_name, count(case when flag=1 then 1 end) as cnt from tablename 
                group by group_name)t1
        ON t.group_name= t1.group_name

您只需使用简单的联接即可:

UPDATE D
SET Type = 1
FROM Data D JOIN
(
  SELECT GroupName
  FROM Data
  WHERE Flag = 1
) T ON D.GroupName = T.GroupName;

下面是一个

您可以通过使用简单的连接来实现:

UPDATE D
SET Type = 1
FROM Data D JOIN
(
  SELECT GroupName
  FROM Data
  WHERE Flag = 1
) T ON D.GroupName = T.GroupName;

这里有一个

这可能是另一个选项

    ;with data
    As (
        Select count(groupname) groupname
               ,max(flag) flag
               ,type

         From Tablename
       Group by type
       Having count(groupname)>1
           And max(flag)=1
)
Update c
Set type =1
From data c

这可能是另一种选择

    ;with data
    As (
        Select count(groupname) groupname
               ,max(flag) flag
               ,type

         From Tablename
       Group by type
       Having count(groupname)>1
           And max(flag)=1
)
Update c
Set type =1
From data c

我将使用窗口功能:

with toupdate as (
      select g.*, max(flag) over (partition by groupname) as new_flag
      from [sampleDB].[dbo].[groups] g
     )
update toupdate
    set flag = new_flag
    where flag <> new_flag;

请注意where子句,因此仅更新标志正在更改的行。即使值没有更改,SQL Server也会尝试更新行,从而导致开销。where子句节省了大部分开销。

我将使用窗口函数:

with toupdate as (
      select g.*, max(flag) over (partition by groupname) as new_flag
      from [sampleDB].[dbo].[groups] g
     )
update toupdate
    set flag = new_flag
    where flag <> new_flag;

请注意where子句,因此仅更新标志正在更改的行。即使值没有更改,SQL Server也会尝试更新行,从而导致开销。where子句节省了大部分开销。

@Dale K以下内容不起作用。当从tg>0中选择COUNT*时更新t1 SET type=CASE,然后从[sampleDB].[dbo].[groups]t1从[sampleDB].[dbo].[groups]t2 tg从tg.groupName=t1.groupName和tg.flag=1中选择t2.groupName和t2.flag@Dale K以下内容不起作用。当从tg>0中选择COUNT*时更新t1 SET type=CASE,然后从[sampleDB].[dbo].[groups]t1从[sampleDB].[dbo].[groups]t2 tg从tg.groupName=t1.groupName和tg.flag=1中选择t2.groupName和t2.flag;谢谢你的快速回复。这对我来说非常有效!!我被卡住了,因为我不明白当flag=1然后1结束时如何使用countcase。你教了我正确的用法。谢谢你的快速回复。这对我来说非常有效!!我被卡住了,因为我不明白当flag=1然后1结束时如何使用countcase。你教了我正确的用法。请不要只发布代码作为答案,还要解释你的代码的作用以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引更多的投票。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。