如何按行对各商品Pfit列的+/-值进行条件递增计数?
实现商品分组下Pfit符号的递增计数
你现在需要给每个商品分组,对Pfit列里的+和-分别按行的先后顺序(按日期排序)做递增编号对吧?先结合你的示例数据,明确下期望的输出效果(新增Seq列):
| n | id | Name | ShipDate | Pfit | Seq |
|---|---|---|---|---|---|
| 1 | 1 | apple | 2018-04-14 | + | 1 |
| 2 | 1 | apple | 2018-04-15 | + | 2 |
| 3 | 1 | apple | 2018-04-16 | + | 3 |
| 4 | 1 | apple | 2018-04-17 | - | 1 |
| 5 | 1 | apple | 2018-04-18 | - | 2 |
| 1 | 2 | bread | 2018-04-14 | - | 1 |
| 2 | 2 | bread | 2018-04-15 | - | 2 |
| 3 | 2 | bread | 2018-04-16 | + | 1 |
| 1 | 3 | orange | 2018-04-14 | + | 1 |
| 2 | 3 | orange | 2018-04-15 | + | 2 |
| 3 | 3 | orange | 2018-04-16 | - | 1 |
| 1 | 4 | tomato | 2018-04-14 | + | 1 |
| 2 | 4 | tomato | 2018-04-15 | - | 1 |
| 3 | 4 | tomato | 2018-04-16 | - | 2 |
核心解决方案:用窗口函数实现
这类分组计数需求,用SQL的窗口函数是最简洁高效的,推荐用ROW_NUMBER()来实现:
SELECT n, id, Name, ShipDate, Pfit, -- 按商品+符号分区,按日期排序生成序号 ROW_NUMBER() OVER ( PARTITION BY Name, Pfit ORDER BY ShipDate ) AS Seq FROM your_table_name; -- 替换成你的实际表名
代码细节解释
PARTITION BY Name, Pfit:先把数据按商品名称分组,再在每个商品组里,把+和-的记录分成两个子组;ORDER BY ShipDate:保证每个子组内的记录是按日期先后顺序排列的,这样序号才是递增的;ROW_NUMBER():在每个子组里,给每条记录分配一个从1开始的连续序号,正好满足你的需求。
特殊情况处理
如果你的表中存在同一商品同一日期有多个相同符号的记录,想要保证序号和原始数据的n列顺序一致,可以把n加入排序条件:
ROW_NUMBER() OVER ( PARTITION BY Name, Pfit ORDER BY ShipDate, n ) AS Seq
内容的提问来源于stack exchange,提问作者Robin Vlaar
相关产品推荐
相关产品推荐

