能否修改ROW_NUMBER()取值逻辑生成带后缀的ProductID?
可以实现该需求,以下是解决方案
首先你当前的SQL存在语法错误,ProductID = ProductID = ROW_NUMBER() OVER (...) 的赋值方式不正确,这会导致你得到的不是预期的分组行号。以下是修正后的实现方案:
实现思路
- 先按原始
ProductID分组,为每组内的记录生成从1开始的行号,排序规则对应你目标结果里的TransactionDate升序排列 - 根据组内行号拼接显示用的ProductID:
- 行号为1时,直接显示原始ProductID
- 行号大于1时,拼接成「原始ID.行号-1」的格式(比如行号2对应
1.1,行号3对应1.2)
最终SQL代码
SELECT ProductID = CASE WHEN rn = 1 THEN CAST(OriginalProductID AS VARCHAR(20)) ELSE CAST(OriginalProductID AS VARCHAR(20)) + '.' + CAST(rn - 1 AS VARCHAR(20)) END, TransactionDate, TransactionAmount FROM ( SELECT OriginalProductID = ProductID, TransactionDate, TransactionAmount, rn = ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY TransactionDate ASC) FROM ProductsSales ) t ORDER BY OriginalProductID, rn
代码说明
- 子查询中:
OriginalProductID保留原始的产品IDrn是每组内的行号,按TransactionDate升序生成,确保同组内的记录顺序符合你目标结果的要求
- 外层查询通过
CASE语句拼接显示用的ProductID,实现你要的格式 - 最终排序按原始ProductID和组内行号,保证分组和顺序正确
验证结果
执行上述SQL后,会得到你想要的格式:
| ProductID | TransactionDate | TransactionAmount |
|---|---|---|
| 1 | 2022-11-06 | 30 |
| 1.1 | 2022-11-12 | 30 |
| 1.2 | 2022-11-28 | 30 |
| 2 | 2022-11-03 | 10 |
| 2.1 | 2022-11-10 | 10 |
| 2.2 | 2022-11-15 | 10 |
| 3 | 2022-11-02 | 50 |
内容的提问来源于stack exchange,提问作者Al Simmons
相关产品推荐
相关产品推荐

