SQL按Item分组:获取指定状态对应的最小、最大日期需求问询
解决方案:按Item分组获取指定状态的日期极值
原始数据
| Item | Date | Status Column |
|---|---|---|
| WidgetA | 2022-01-03 | 1 |
| WidgetB | 2022-01-04 | 1 |
| WidgetA | 2022-01-05 | 2 |
| WidgetB | 2022-01-06 | 2 |
| WidgetA | 2022-01-02 | 1 |
| WidgetB | 2022-01-01 | 1 |
期望结果
| Item | start | complete |
|---|---|---|
| WidgetA | 2022-01-02 | 2022-01-05 |
| WidgetB | 2022-01-01 | 2022-01-06 |
实现方案
1. SQL 实现
用条件聚合就能直接完成需求,通过CASE WHEN筛选指定状态的行,再结合聚合函数计算极值,最后按Item分组:
SELECT Item, MIN(CASE WHEN `Status Column` = 1 THEN Date END) AS start, MAX(CASE WHEN `Status Column` = 2 THEN Date END) AS complete FROM your_table_name -- 替换成你的实际表名 GROUP BY Item;
MIN(CASE WHEN ...):仅保留状态为1的日期,取其中最小值作为startMAX(CASE WHEN ...):仅保留状态为2的日期,取其中最大值作为completeGROUP BY Item:确保每个Item只输出一行聚合结果
2. Python Pandas 实现
如果用Pandas处理数据,有两种简洁的写法:
写法一:agg 聚合
import pandas as pd # 假设原始数据存储在df中 result = df.groupby('Item').agg( start=('Date', lambda x: x[df.loc[x.index, 'Status Column'] == 1].min()), complete=('Date', lambda x: x[df.loc[x.index, 'Status Column'] == 2].max()) ).reset_index()
写法二:pivot_table 透视表
import pandas as pd result = df.pivot_table( index='Item', values='Date', columns='Status Column', aggfunc={1: 'min', 2: 'max'} ).rename(columns={1: 'start', 2: 'complete'}).reset_index()
两种写法都能得到你需要的结果,根据习惯选择即可。
内容的提问来源于stack exchange,提问作者user3232808
相关产品推荐
相关产品推荐

