SQL-根据同一组中的其他列值更改列值&不同的行

时间:2015-09-24 15:24:53

标签: sql-server

我在SQL Server中有一个表:

Table with Unique IDs that can be part of the same Group

唯一ITEM_ID是群组的一部分(GROUP_NUMBER)。 IS_ACTIVEIS_LAST为1 - true或0 - false。

我想做什么:

我想查看此表以及每个有效的ITEM_IDIS_ACTIVE = 1),它是我想要制作的组ITEM_ID中唯一有效GROUP_NUMBER的{​​{1}}该行的IS_LAST设置为1。

例如,在上表中,ITEM_ID = 6的行,我希望IS_LAST为1

我不知道如何做到这一点,因为我不熟练使用SQL。我正在尝试使用partition by命令来拆分每个组,但是检查ITEM_ID是否是其组中唯一的活动组件似乎具有挑战性。

感谢您的任何帮助或指导。

应该注意的是,我不想以任何方式进行更新或更改实际表,只需设计一个可以进行更改的查询并吐出该表的更改版本。

3 个答案:

答案 0 :(得分:1)

以下查询返回ITEM_ID,其中只有一个在组中有效:

select ITEM_ID from MyTable M 
where IS_ACTIVE = 1 and 
  not exists (select null 
              from MyTable N where n.IS_ACTIVE = 1 and 
                M.GROUP_NUMBER = N.GROUP_NUMBER and M.ITEM_ID <> N.ITEM_ID)

然后,您可以使用left join MyTable此查询。类似的东西:

select *
from MyTable A left join (<query above>) B on A.ITEM_ID = B.ITEM_ID

如果B.ITEM_ID不为空,则IS_LAST = 1.

答案 1 :(得分:1)

这是解决方案:

DECLARE @t TABLE(ITEM_ID INT, GROUP_NUMBER INT, IS_ACTIVE BIT, IS_LAST bit)

INSERT INTO @t VALUES
(1, 1, 1, 0),
(2, 1, 1, 0),
(3, 2, 0, 0),
(4, 2, 0, 0),
(5, 2, 0, 0),
(6, 3, 1, 0),
(7, 3, 0, 0)


SELECT t1.ITEM_ID, 
       t1.GROUP_NUMBER, 
       t1.IS_ACTIVE, 
       CASE WHEN t1.IS_ACTIVE = 1 AND 
                   NOT EXISTS(SELECT * FROM @t t2 
                              WHERE t2.IS_ACTIVE = 1 AND t1.GROUP_NUMBER = t2.GROUP_NUMBER AND 
                                       t1.ITEM_ID <> t2.ITEM_ID) 
            THEN 1 ELSE 0 END AS IS_LAST 
FROM @t t1

答案 2 :(得分:1)

我认为你在Partition By的正确轨道上。我能想到的最好方法是使用一些代码:

SELECT Item_ID, Group_Number, Is_Active, 
COUNT(*) OVER (PARTITION BY Group_Number, Is_Active ORDER BY Group_Number) [Members_In_Set], 
CASE WHEN Is_Active = 1 AND COUNT(*) OVER (PARTITION BY Group_Number, Is_Active ORDER BY Group_Number) = 1 THEN 1 ELSE 0 END [Is_Last]
FROM My_Table

Members_In_Set列用于演示分区时计数返回的内容,然后CASE显示如何使用此值和Is_Active来获取您之后的结果