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

时间:2018-08-22 20:02:11

标签: sql postgresql gaps-and-islands

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

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

我希望添加一个唯一且递增的ID,该ID以category ='Delivery'开始,并在category ='Return'之后结束/重置。

例如...

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定义的,并在查询中保存-我没有要更新的实际基础表

1 个答案:

答案 0 :(得分:2)

使用渐进式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)