根据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)
我有一个 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)