Power Query中按资产统一更新SourceType状态的实现方案
批量更新资产状态的实现方案
需求规则
- 若同一资产(Name)下存在任意一个SourceType的状态为
In-Active,则该资产下所有SourceType的状态统一更新为In-Active - 仅当某资产下所有3个SourceType的状态均为
Active时,才保留Active状态
原始数据表格
| Name | SourceType | Date | Status |
|---|---|---|---|
| Asset 1 | Security | 27-03-2024 | Active |
| Asset 1 | Application | 24-03-2024 | In-Active |
| Asset 1 | System | 27-03-2024 | Active |
| Asset 2 | System | 27-03-2024 | Active |
| Asset 2 | Security | 21-02-2024 | In-Active |
| Asset 2 | Application | 15-06-2023 | In-Active |
| Asset 3 | System | 27-03-2024 | Active |
| Asset 3 | Security | 21-02-2024 | Active |
| Asset 3 | Application | 15-06-2023 | Active |
期望输出表格
| Name | SourceType | Date | Status |
|---|---|---|---|
| Asset 1 | Security | 27-03-2024 | In-Active |
| Asset 1 | Application | 24-03-2024 | In-Active |
| Asset 1 | System | 27-03-2024 | In-Active |
| Asset 2 | System | 27-03-2024 | In-Active |
| Asset 2 | Security | 21-02-2024 | In-Active |
| Asset 2 | Application | 15-06-2023 | In-Active |
| Asset 3 | System | 27-03-2024 | Active |
| Asset 3 | Security | 21-02-2024 | Active |
| Asset 3 | Application | 15-06-2023 | Active |
实现方法
方法1:Excel/Google Sheets 公式实现
假设数据在A2:D10区域,新增一列E作为更新后的状态,在E2单元格输入以下公式,下拉填充即可:
=IF(COUNTIFS($A$2:$A$10,A2,$D$2:$D$10,"In-Active")>0,"In-Active","Active")
公式逻辑:统计当前资产对应的所有行中,状态为In-Active的数量,若大于0则返回In-Active,否则返回Active。之后可将E列值复制粘贴到D列替换原状态。
方法2:Python Pandas 实现
import pandas as pd # 读取数据(可替换为直接构造DataFrame或读取其他格式文件) df = pd.read_csv("your_data.csv") # 按资产分组,判断每组是否存在In-Active状态 asset_final_status = df.groupby("Name")["Status"].apply( lambda x: "In-Active" if (x == "In-Active").any() else "Active" ) # 将分组结果映射回原表格 df["Status"] = df["Name"].map(asset_final_status) # 输出并保存结果 print(df) df.to_csv("updated_asset_status.csv", index=False)
方法3:SQL 实现
假设数据表名为asset_status,执行以下SQL语句更新状态:
-- 先通过临时表确定每个资产的最终状态 WITH asset_final_status AS ( SELECT Name, CASE WHEN EXISTS (SELECT 1 FROM asset_status a2 WHERE a2.Name = a1.Name AND a2.Status = 'In-Active') THEN 'In-Active' ELSE 'Active' END AS final_status FROM asset_status a1 GROUP BY Name ) -- 更新原表的状态字段 UPDATE asset_status a SET Status = (SELECT final_status FROM asset_final_status afs WHERE afs.Name = a.Name);
内容的提问来源于stack exchange,提问作者Maha
相关产品推荐
相关产品推荐

