技术问询:基于首字符求最大值及根据子公司状态生成母公司最高状态列
解决方案:基于首字符求最大值与母公司状态列生成
针对你提出的两个数据处理需求,我整理了不同工具下的实现方案,结合示例数据详细说明:
需求1:在给定条件下,基于首字符求最大值
核心是先提取目标字段的首字符(转为可比较类型),再在指定范围内计算最大值。以下是常用工具的实现方式:
Excel 实现
若首字符为数字,直接提取转数值后求最大值:
=MAX(--LEFT(目标列, 1))(
--用于将提取的字符转为数值,确保能正确计算最大值)若首字符为字母,先转ASCII码求最大值再转回字母:
=CHAR(MAX(CODE(LEFT(目标列, 1))))按首字符分组求对应数值的最大值(假设
A列是带首字符的编码,B列是数值):=MAXIFS(B:B, A:A, LEFT(A2, 1)&"*")
Python Pandas 实现
import pandas as pd # 示例数据集 df = pd.DataFrame({ 'Code': ['AA11', 'VB12', 'XB11', 'AA12', 'BB13'], 'Value': [10, 20, 15, 25, 30] }) # 提取首字符 df['First_Char'] = df['Code'].str[0] # 方案1:按首字符分组求Value的最大值 max_grouped = df.groupby('First_Char')['Value'].max().reset_index() print("按首字符分组的最大值:\n", max_grouped) # 方案2:求首字符本身的最大值(字母按字典序) max_char = df['First_Char'].max() print(f"\n首字符最大值:{max_char}")
SQL 实现
-- 按首字符分组求数值最大值 SELECT LEFT(Code, 1) AS First_Char, MAX(Value) AS Max_Value FROM your_table GROUP BY LEFT(Code, 1); -- 求首字符本身的最大值 SELECT MAX(LEFT(Code, 1)) AS Max_First_Char FROM your_table;
需求2:生成「Parent Status」列(母公司状态取子公司最高级别)
首先明确状态级别规则:1-Start < 2-Mid < 3-Complete,即通过状态字符串的首数字判断级别,数字越大级别越高。以下是结合示例数据的实现:
示例数据回顾
| Sub Status | Parent | Parent Status |
|---|---|---|
| 1-Start | AA | 2-Mid |
| 1-Start | BB | 3-Complete |
| 1-Start | CC | 1-Start |
| 2-Mid | AA | 2-Mid |
| 1-Start | AA | 2-Mid |
| 2-Mid | BB | 3-Complete |
| 3-Complete | BB | 3-Complete |
| 1-Start | DD | 2-Mid |
| 2-Mid | DD | 2-Mid |
Excel 实现
假设数据在A2:D10区域,Parent列在C列,Sub Status在B列:
Excel 365/2021(动态数组):在D2单元格输入公式,自动填充整列
=XLOOKUP(MAX(--LEFT(FILTER(B:B,C:C=C2),1)),--LEFT(FILTER(B:B,C:C=C2),1),FILTER(B:B,C:C=C2))逻辑:筛选当前母公司的所有子公司状态→提取首数字转数值→找到最大值→匹配对应完整状态文本
旧版Excel(数组公式):输入后按
Ctrl+Shift+Enter触发数组计算=INDEX(B:B,MATCH(MAX(IF(C:C=C2,--LEFT(B:B,1))),IF(C:C=C2,--LEFT(B:B,1)),0))
Python Pandas 实现
import pandas as pd # 加载示例数据 data = { 'Sub': ['AA11', 'VB12', 'XB11', 'AA12', 'AA13', 'BB13', 'RW11', 'FX22', 'TF11'], 'Sub Status': ['1-Start', '1-Start', '1-Start', '2-Mid', '1-Start', '2-Mid', '3-Complete', '1-Start', '2-Mid'], 'Parent': ['AA', 'BB', 'CC', 'AA', 'AA', 'BB', 'BB', 'DD', 'DD'] } df = pd.DataFrame(data) # 提取状态级别数字 df['Status_Level'] = df['Sub Status'].str.extract('(\d+)').astype(int) # 按Parent分组,找到最高级别对应的状态 parent_status_map = df.groupby('Parent').apply( lambda x: x.loc[x['Status_Level'].idxmax(), 'Sub Status'] ).to_dict() # 生成Parent Status列 df['Parent Status'] = df['Parent'].map(parent_status_map) print("处理后的数据:\n", df)
SQL 实现
使用窗口函数标记每个母公司的最高级别状态,再关联生成结果:
WITH ranked_status AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Parent ORDER BY CAST(SUBSTRING("Sub Status", 1, 1) AS INT) DESC ) AS rn FROM company_status ) SELECT rs.Sub, rs."Sub Status", rs.Parent, (SELECT "Sub Status" FROM ranked_status WHERE Parent = rs.Parent AND rn = 1) AS "Parent Status" FROM ranked_status rs;
内容的提问来源于stack exchange,提问作者maxarcLT0
相关产品推荐
相关产品推荐

