如何为采购记录表添加客户专属的唯一采购序列列?
如何为采购记录表添加客户专属的唯一采购序列列?
看起来你已经找对方向了——用ROW_NUMBER()窗口函数是正确思路,但差了最关键的一步:没有按客户分组生成专属序列。我来帮你调整一下!
你之前的写法ROW_NUMBER() OVER (ORDER BY CustID, Item)是给整个表按客户和商品排序生成全局序列,而我们需要的是每个客户单独拥有自己的序列,这时候就得用上PARTITION BY子句来拆分数据集。
正确的SQL语句
假设你的采购表名为purchases,可以用下面的查询来生成想要的结果:
SELECT Idx, CustID, Item, Date, ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY Date) AS Sequence FROM purchases ORDER BY CustID, Sequence;
关键部分解释
PARTITION BY CustID:这是核心!它会把整个表格的数据按照CustID拆分成独立的分组,每个客户对应一个分组,序列会在每个分组内单独计算。ORDER BY Date:在每个客户的分组里,我们按照采购日期的先后排序,这样生成的序列就能对应客户的采购顺序了。- 最后的
ORDER BY CustID, Sequence是为了让输出结果和你期望的格式一致,按客户和序列值排序展示。
执行后的结果
运行上面的查询后,你会得到和你预期完全一致的表格:
| Idx | CustID | Item | Date | Sequence |
|---|---|---|---|---|
| 1 | 1 | Black Ink | 2023-01-01 | 1 |
| 3 | 1 | Black Ink | 2023-01-12 | 2 |
| 2 | 2 | Red Ink | 2023-01-21 | 1 |
| 4 | 2 | Red ink | 2023-02-14 | 2 |
备注:内容来源于stack exchange,提问作者Seamus




