复杂逻辑筛选唯一

业务需求

某业务场景,某表rst的同一code有多条数据,按以下顺序取出唯一数据:

  1. 优先取属性a=‘营业中',可能多条
  2. 优先取属性b=‘启用',可能多条
  3. 优先取时间c最晚的
  4. 优先取时间d最晚的

逻辑分析

常规步骤可能按业务需求分4大步取数,逐层筛选,而每一步又需要2-3小步才能实现。
变换思路,整体考虑,其实就是按abcd这4个字段依次排序,取排序后的第一条。
这是一条标准的sql分窗,按code分窗,取row_number=1的。

sql实现

一个小问题,cd时间字段容易排序,ab字段是字符串不论正序、逆序都不能保证排在第一位,因此需要先对ab字段稍作加工,完整实现:

--1.处理ab字段
create temp table rst2 as
select *,
        case when a=‘营业中' then 1 else 2 end as a2,
        case when b=‘启用' then 1 else 2 end as b2
from rst;
--2.分窗排序取序号1
with cte as(
        select *,row_number() over (partition by code order by a2,b2,c desc nulls last,d desc nulls last) as rn -- nulls last,默认null值最大,设置null排最后
        from rst2
) select * from cte where rn=1;

你可能感兴趣的:(复杂逻辑筛选唯一)