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' 对该组有效,则层级可能有多个条目并且返回所有条目是一个有效方案。
使用 QAULIFY
和 DENSE_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' )
问题陈述: 需要根据定义的层次规则列进行任何首次匹配 示例:好像第 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' 对该组有效,则层级可能有多个条目并且返回所有条目是一个有效方案。
使用 QAULIFY
和 DENSE_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' )