Problem Statement:需要根据定义的hier规则列进行任何第一次匹配

Sample:

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;

Expected Output:

注意:hier可能有多个条目,如果规则=‘是’对该组有效,则返回所有条目是有效的方案.

enter image description here

推荐答案

使用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;

对于HIER 3,此版本仅返回YES

输出:

enter image description here


如果目标是获得整个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

输出:

enter image description here

相关:Equivalent for Keep in Snowflake

Sql相关问答推荐

SQL查询以条件空值跟踪生产操作结果进展

用于动态查询情况的存储过程常识模式

使用来自不同深度的嵌套组的值执行计算的干净方法?

在Golang中管理数据库事务的简洁方法

如何查询jsonb列是一个对象数组?

删除事务中的本地临时表

Access中执行INSERT INTO查询时出现错误消息

检索上一个星期四和上一个星期三

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

PostgreSQL:按小时查看调整日期

将结果从一列转换为两行或更多

在SELECT中将日期格式转换为双周时段

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

使用其他表 SUM 的交换价格转换价格并获得 AVG

Set vs let vs 在snowflake中声明变量

如何仅在满足条件时才按顺序在 SQL 中计数?

如何找到特定时间间隔内的最大和最小日期?

SQL中所有先前日期的累计总和

使用 SQL 表中的连接列删除重复记录

关于oracle sql中的数据透视表