如何在具有特定条件的组中仅将一行标记为 "active"
How to mark only one row as "active" in a group shared same Id with particular conditions
我在 SQL Server 2014 中有一个 table,如下所示:
现在我想再添加一个名为 "Status" 的列来为同一个人标记每一行。
- 如果类别 = 3 且费用 <> 0,则将此行标记为 "Active",其余行(1 和 2)将是 "non-active";
- 如果 Category = 3 且 Fee = 0,则它移至 Category = 1,其中 Fee <> 0 并将其设为 "Active",则其余的 (2, 3) 将为 "non-active";
- 如果 Category = 3 和 1 并且 Fee =0 ,则将最后一个(Category =2)标记为 "Active",不管 Category 2 的 Fee = 0 / <> 0 .
我正在考虑使用 :
Status = CASE
WHEN (Category = 3 AND Fee <> 0 )
OR (Category = 3 AND Fee = 0 AND (Category = 1 AND Fee <> 0))
OR (Category IN (1, 3) AND Fee = 0 AND (Category = 2 AND Fee IS NOT NULL))
THEN "Active"
ELSE "Non-Active"
END
但我不确定它是否正确。我也想知道是否有更有效的方法来实现这个结果。
您可以使用 row_number()
:
select t.*,
(case when 1 = row_number() over (partition by personid
order by (case when category = 3 and fee <> 0 then 1
when category = 1 and fee <> 0 then 2
when category = 2 then 3
else 4 end)
then 'active' else 'inactive'
end) as status
from t;
我在 SQL Server 2014 中有一个 table,如下所示:
现在我想再添加一个名为 "Status" 的列来为同一个人标记每一行。
- 如果类别 = 3 且费用 <> 0,则将此行标记为 "Active",其余行(1 和 2)将是 "non-active";
- 如果 Category = 3 且 Fee = 0,则它移至 Category = 1,其中 Fee <> 0 并将其设为 "Active",则其余的 (2, 3) 将为 "non-active";
- 如果 Category = 3 和 1 并且 Fee =0 ,则将最后一个(Category =2)标记为 "Active",不管 Category 2 的 Fee = 0 / <> 0 .
我正在考虑使用 :
Status = CASE
WHEN (Category = 3 AND Fee <> 0 )
OR (Category = 3 AND Fee = 0 AND (Category = 1 AND Fee <> 0))
OR (Category IN (1, 3) AND Fee = 0 AND (Category = 2 AND Fee IS NOT NULL))
THEN "Active"
ELSE "Non-Active"
END
但我不确定它是否正确。我也想知道是否有更有效的方法来实现这个结果。
您可以使用 row_number()
:
select t.*,
(case when 1 = row_number() over (partition by personid
order by (case when category = 3 and fee <> 0 then 1
when category = 1 and fee <> 0 then 2
when category = 2 then 3
else 4 end)
then 'active' else 'inactive'
end) as status
from t;