我在SQL Server中有一个表:
唯一ITEM_ID
是群组的一部分(GROUP_NUMBER
)。 IS_ACTIVE
和IS_LAST
为1 - true或0 - false。
我想做什么:
我想查看此表以及每个有效的ITEM_ID
(IS_ACTIVE = 1
),它是我想要制作的组ITEM_ID
中唯一有效GROUP_NUMBER
的{{1}}该行的IS_LAST
设置为1。
例如,在上表中,ITEM_ID = 6
的行,我希望IS_LAST
为1
我不知道如何做到这一点,因为我不熟练使用SQL。我正在尝试使用partition by
命令来拆分每个组,但是检查ITEM_ID
是否是其组中唯一的活动组件似乎具有挑战性。
感谢您的任何帮助或指导。
应该注意的是,我不想以任何方式进行更新或更改实际表,只需设计一个可以进行更改的查询并吐出该表的更改版本。
答案 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来获取您之后的结果