Select 第一次匹配基于列规则

Select first match based on column rule

问题陈述: 需要根据定义的层次规则列进行任何首次匹配 示例:好像第 1 层没有匹配项,但第 2 层匹配,那么 select sec_id 对第 2 层

样本:

with cte_tab as (select column1 as hier, column2 as rule, column3 as sec_id from values
       (1, 'NO','COM'), (1, 'NO','COM'), (2, 'NO','COM'), (3, 'YES','COM')
    order by column1)
select * from cte_tab;

预期输出: 在下面的示例中,预期输出将是 hier = 3 的行,因为它是 rule='YES'

组中的第一个匹配项

注意:如果规则 = 'YES' 对该组有效,则层级可能有多个条目并且返回所有条目是一个有效方案。

使用 QAULIFYDENSE_RANK:

with cte_tab as (
   select column1 as hier, column2 as rule, column3 as sec_id 
   from values
       (1, 'NO','COM'), (1, 'NO','COM'), (2, 'NO','COM'), (3, 'YES','COM')
   order by column1)
select * 
from cte_tab
QUALIFY DENSE_RANK() OVER(ORDER BY RULE='YES' DESC, HIER) = 1;

此版本 returns 仅 YES 用于 HIER 3

输出:


如果无论规则如何,目标都是获得整个 HIER 3,那么:

with cte_tab as (
    select column1 as hier, column2 as rule, column3 as sec_id 
    from values
       (1, 'NO','COM'), (1, 'NO','COM'), (2, 'NO','COM'),
       (3, 'YES','COM'), (3, 'NO', 'A')
    order by column1)
select * 
from cte_tab
QUALIFY HIER=(ARRAY_AGG(HIER) WITHIN GROUP(ORDER BY RULE='YES' DESC) OVER())[0]::TEXT

输出:

相关:Equivalent for Keep in Snowflake

也许我遗漏了一些东西,但如果您只需要过滤数据以获得符合条件的员工,这不是更简单吗?

select *
from t
where hier in (select min(hier) from t where rule='YES' )