Power BI DAX 实现按产品分组、Set=1时组号递增且新产品组号重置
分组编号需求实现方案
需求说明
现有包含Index、Product、Set三个字段的有序数据,要求按Product分区计算组号:
- 同一Product下,每遇到Set=1后,下一段数据的组号递增1
- 切换到新Product时,组号自动重置为1
原始数据
| Index | Product | Set |
|---|---|---|
| 1 | Table | 0 |
| 2 | Table | 0 |
| 3 | Table | 1 |
| 4 | Table | 0 |
| 5 | Table | 0 |
| 6 | Table | 1 |
| 7 | Table | 0 |
| 8 | Table | 1 |
| 9 | Chair | 0 |
| 10 | Chair | 0 |
| 11 | Chair | 0 |
| 12 | Chair | 1 |
| 13 | Chair | 0 |
| 14 | Chair | 0 |
| 15 | Chair | 1 |
期望输出
| Index | Product | Set | Group |
|---|---|---|---|
| 1 | Table | 0 | 1 |
| 2 | Table | 0 | 1 |
| 3 | Table | 1 | 1 |
| 4 | Table | 0 | 2 |
| 5 | Table | 0 | 2 |
| 6 | Table | 1 | 2 |
| 7 | Table | 0 | 3 |
| 8 | Table | 1 | 3 |
| 9 | Chair | 0 | 1 |
| 10 | Chair | 0 | 1 |
| 11 | Chair | 0 | 1 |
| 12 | Chair | 1 | 1 |
| 13 | Chair | 0 | 2 |
| 14 | Chair | 0 | 2 |
| 15 | Chair | 1 | 2 |
实现方案
1. SQL实现(支持窗口函数版本,适配MySQL8.0+、PostgreSQL、SQL Server等)
核心逻辑:先对每个Product内的Set列做前向偏移1位,累计偏移后列中1的出现次数,加1即为当前行组号。
SELECT `Index`, Product, `Set`, SUM(CASE WHEN lag_set = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY Product ORDER BY `Index`) + 1 AS `Group` FROM ( SELECT *, LAG(`Set`, 1, 0) OVER (PARTITION BY Product ORDER BY `Index`) AS lag_set FROM your_table_name ) t ORDER BY `Index`;
将代码中的your_table_name替换为实际表名即可执行。
2. Python Pandas实现
import pandas as pd # 构造示例数据,实际使用时可替换为读取自己的数据源 df = pd.DataFrame({ 'Index': range(1,16), 'Product': ['Table']*8 + ['Chair']*7, 'Set': [0,0,1,0,0,1,0,1,0,0,0,1,0,0,1] }) # 分组计算组号 df['Group'] = df.groupby('Product')['Set'].apply( lambda x: x.shift(1, fill_value=0).cumsum() + 1 ).reset_index(drop=True) print(df)
3. Excel实现
假设数据从第2行开始,A列为Index、B列为Product、C列为Set、D列为待计算的Group:
- D2单元格直接填入
1 - D3单元格输入公式:
=IF(B3<>B2,1,IF(C2=1,D2+1,D2)) - 将D3的公式向下拖拽填充到所有行即可
内容的提问来源于stack exchange,提问作者Levy
相关产品推荐
相关产品推荐

