如何根据sql中的关键字为记录设置标志

ikfrs5lh  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(375)

我有一个用例,在这个用例中,我想根据关键字标记一个记录,然后对下一组记录设置相同的标记,直到我们得到另一个关键字。
例如

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

因此,当我找到时,它应该设置标志y,然后将标志y设置到下一组记录,直到我找到xyz,然后将标志设置为n,直到我找到,依此类推。
事先谢谢你的帮助。

holgip5t

holgip5t1#

这有点老套,但这应该管用:
创建测试数据:

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
ukqbszuj

ukqbszuj2#

如果我可以假设每个后面都跟有xyz,而不是,那么您可以使用和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;

再一次, ? 指定排序的列。

相关问题