如何在SQL中基于关键字为记录设置标志

时间:2018-07-20 09:38:15

标签: sql hive flags

我有一个用例,在这种情况下,我想基于一个关键字标记一条记录,然后在下一组记录中设置相同的标记,直到获得另一个关键字为止。

例如

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,依此类推。

预先感谢您的帮助。

2 个答案:

答案 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;

再次,?是指定顺序的列。