Filter those data from table where there is a gap in sequence

微笑、不失礼 提交于 2019-12-06 15:03:08

You could treat gaps and islands as string i.e. 'IGGI', squash it, and search for 'IGI' pattern:

SELECT *, CASE WHEN squashed LIKE '%IGI%' THEN 0 ELSE 1 END AS new_doprocess
FROM TestSAMP t
CROSS APPLY(SELECT STRING_AGG(CASE WHEN t = '' THEN 'G' ELSE 'I'END, '') r
             FROM (VALUES (1,id, target1), (2,id, target2),
                          (3,id, target3), (4,id, target4)) sub(rn, id, t)) s
CROSS APPLY (SELECT replace(replace(replace(replace(replace(replace(s.r,'G','<>')
   ,'><',''),'<>','G'),'I','<>'),'><',''),'<>','I')) AS sub(squashed)
ORDER BY t.id;

db<>fiddle demo

Example:

  id  | target1  | target2  | target3  | target4  |  r    | squashed  | doprocess 
 -----|----------|----------|----------|----------|-------|-----------|----------- 
   1  | T1       | T2       | T3       | T4       | IIII  | I         |         1 
   2  | T1       |          | T3       | T4       | IGII  | IGI       |         0 
   3  | T1       | T2       |          |          | IIGG  | IG        |         1 
   4  | T1       | T2       |          | T4       | IIGI  | IGI       |         0 
   5  |          |          |          | T4       | GGGI  | GI        |         1 
   6  |          |          |          |          | GGGG  | G         |         1 

The easiest way should be a Boolean expression checking if a predecessor is empty when a successor is not.

UPDATE testsamp
       SET doprocess = 0
       WHERE target2 <> ''
             AND target1 = ''
              OR target3 <> ''
                 AND target2 = ''
               OR target4 <> ''
                   AND target3 = '';

You might want to extend it for example if it's also invalid, when all targets are empty. I don't know if you want that.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!