1

我正在尝试编写子选择,它将遍历返回的数据,然后检查所有状态,然后决定唯一性逻辑。

有没有办法找出以下?

  • 如果任何数据具有“活动”状态,第一个将被标记为 1,其他所有数据都为 0
  • 如果没有“活动”状态,则第一个“过期”状态将标记为 1,其他所有状态都标记为 0
  • 如果没有“活动”和“过期”状态,那么首先“进行中”将被标记为 1,其他所有内容都标记为 0

我试图这样写,但我需要在一个案例陈述中使用它

SELECT a.id, a.status,
,(SELECT 
    CASE WHEN b.STATUS = 'Active' THEN 1 ELSE 0 END
    CASE WHEN b.STATUS = 'Expired' THEN 1 ELSE 0 END 
    FROM b.TABLE
    WHERE a.id=b.id )AS unique
FROM my.TABLE 

结果应该看起来像https://i.stack.imgur.com/qCA74.png过期案例的图片

提前感谢您的任何提示。

4

2 回答 2

1

使用窗口函数:

select t.*,
       (case when row_number() over (partition by id
                                     order by case status when 'Active' then 1 when 'Expired' then 2 else 3 end
                                    ) = 1
             then 1 else 0
        end) as unique_flag
from my.table t;
于 2020-11-24T16:09:56.447 回答
0

如果查找表与源表相同,则可以使用LAG带有常量的函数并使用其默认值将第一行标记为 1,其他行标记为 0。但是您需要按某些字段对行进行排序以处理重复项地位。

select a.id, a.status,
  lag(0, 1, 1) over(
    partition by a.id
    order by 
      case a.status
        when 'Active' then 0
        when 'Expired' then 1
        else 3
      end asc,
      a.some_more_columns asc /*To find that first row when there are duplicates by status*/
  ) as unique_flag
from MY_TABLE a

那么对象命名呢:永远不要使用关键字作为标识符。调用日期为date的列、用户为的表users和一些未知的表table使您的设计容易出错。

于 2020-11-24T16:51:51.833 回答