我有一个用例,在这种情况下,我想基于一个关键字标记一条记录,然后在下一组记录中设置相同的标记,直到获得另一个关键字为止。
例如
I have two keyword ABC and XYZ
Action Flag
ABC Y
CDS Y
DES Y
EXD Y
DEA Y
XYZ N
SED N
DRF N
WSA N
ABC Y and so on
因此,当我找到ABC时,应将标志Y设置为Y,然后再将标志Y设置为下一组记录,直到找到XYZ,然后再将标志设置为N直到找到ABC,依此类推。
预先感谢您的帮助。
答案 0 :(得分:0)
有点黑,但这应该可以工作:
创建测试数据:
CREATE TABLE #TEST
(Ref VARCHAR(3),
Flag VARCHAR(1) NULL
);
INSERT INTO #TEST(Ref)
VALUES('ABC'), ('CDS'), ('DES'), ('EXD'), ('DEA'), ('XYZ'), ('SED'), ('DRF'), ('WSA'), ('ABC');
更新记录
DECLARE @Flag VARCHAR(1);
DECLARE @Ref VARCHAR(3);
DECLARE db_cursor CURSOR
FOR
SELECT Ref
FROM #TEST;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @Ref;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @Ref = 'ABC'
BEGIN
SET @Flag = 'Y';
END;
IF @Ref = 'XYZ'
BEGIN
SET @Flag = 'N';
END;
UPDATE #TEST
SET
Flag = @Flag
WHERE Ref = @Ref;
FETCH NEXT FROM db_cursor INTO @Ref;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
选择并删除测试表
SELECT * FROM #TEST;
DROP TABLE #TEST;
这将返回:
Ref Flag
ABC Y
CDS Y
DES Y
EXD Y
DEA Y
XYZ N
SED N
DRF N
WSA N
ABC Y
答案 1 :(得分:0)
如果我可以假设每个ABC后面都跟随有XYZ,而从来没有ABC,那么您可以使用ABC和XYZ的累加总和来定义组:
select t.*,
(case when sum(case when action = 'ABC' then 1
when action = 'XYZ' then -1
end) over (order by ?) > 0
then 'Y'
else 'N'
end) as flag
from t;
?
用于指定顺序的列。
如果条件不成立,但是这些只是开关,那么您需要查看最新值。这是一种方法:
select t.*,
(case when max(case when action = 'ABC' then ? end) over (order by ?) >
max(case when action = 'XYZ' then ? end) over (order by ?)
then 'Y' else 'N'
end) as flag
from t;
再次,?
是指定顺序的列。