SQL - select 子句中的 Subselect - 如何创建决定唯一性逻辑的列
SQL - Subselect in select clause - how to create column which decides uniqity logic
我正在尝试编写 subselect,它将 运行 通过返回的数据,然后检查所有状态,然后决定唯一性逻辑。
有什么办法可以查到关注的吗?
- 如果任何数据具有 'Active' 状态,第一个将标记为 1,其他所有都标记为 0
- 如果没有 'Active' 状态,那么第一个 'Expired' 状态将标记为 1,其他所有标记为 0
- 如果没有 'Active' 和 'Expired' 状态,那么第一个 'In Progress' 将被标记为 1,其他所有标记为 0
我试着这样写,但我需要在一个 case 语句中包含它
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过期案例的图片
提前感谢您的任何提示。
使用window函数:
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;
如果查找 table 与源 table 相同,那么您可以使用带有常量的 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
、table 的列,用户为 users
,一些未知的 table 为 table
会使您的设计容易出错。
我正在尝试编写 subselect,它将 运行 通过返回的数据,然后检查所有状态,然后决定唯一性逻辑。
有什么办法可以查到关注的吗?
- 如果任何数据具有 'Active' 状态,第一个将标记为 1,其他所有都标记为 0
- 如果没有 'Active' 状态,那么第一个 'Expired' 状态将标记为 1,其他所有标记为 0
- 如果没有 'Active' 和 'Expired' 状态,那么第一个 'In Progress' 将被标记为 1,其他所有标记为 0
我试着这样写,但我需要在一个 case 语句中包含它
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过期案例的图片
提前感谢您的任何提示。
使用window函数:
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;
如果查找 table 与源 table 相同,那么您可以使用带有常量的 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
、table 的列,用户为 users
,一些未知的 table 为 table
会使您的设计容易出错。