根据postgresql中的某些值为多行分配唯一ID

Assigning a unique ID for several rows based on certain values in postgresql

我有一个 CTE returns 类似于您在下面看到的内容:

Date   | ID | Category
--------------------
1/1/18 | 1  | Delivery
1/2/18 | 2  | Return
1/4/18 | 3  | Delivery 
1/5/18 | 4  | Middle
1/6/18 | 5  | Return
1/7/18 | 6  | Delivery

我希望在类别 = 'Return'.

之后添加一个以类别 = 'Delivery' 和 ends/resets 开头的唯一递增 ID

例如...

Date   | ID | Category | New ID
-------------------------------
1/1/18 | 1  | Delivery |  1
1/2/18 | 2  | Return   |  1
1/4/18 | 3  | Delivery |  2
1/5/18 | 4  | Middle   |  2
1/6/18 | 5  | Return   |  2
1/7/18 | 6  | Delivery |  3
...

我的大部分经验都是 MySQL,所以我可以用存储过程很容易地做到这一点,但很难用 postgres 弄明白。

请注意,这全部由 CTE 定义并保留在查询中 - 我没有实际的底层 table 来更新

使用渐进式sum()计算Delivery类别的实例数:

with my_data(date, id, category) as (
values
    ('1/1/18', 1, 'Delivery'),
    ('1/2/18', 2, 'Return'),
    ('1/4/18', 3, 'Delivery'),
    ('1/5/18', 4, 'Middle'),
    ('1/6/18', 5, 'Return'),
    ('1/7/18', 6, 'Delivery')
)

select *, sum((category = 'Delivery')::int) over (order by id) as new_id
from my_data

  date  | id | category | new_id 
--------+----+----------+--------
 1/1/18 |  1 | Delivery |      1
 1/2/18 |  2 | Return   |      1
 1/4/18 |  3 | Delivery |      2
 1/5/18 |  4 | Middle   |      2
 1/6/18 |  5 | Return   |      2
 1/7/18 |  6 | Delivery |      3
(6 rows)