使用按另一个列值分组更新列值

Update column value using group by another column value

我正在解决一个快递服务的问题,他们有不同的路线,每条路线可以有n个包裹。他们在一个袋子里安排了 2 个包裹。我设法获得了如下数据:

Route  | ParcelId | GroupId |
-------|----------|---------
NORTH  | P1       |    1    | 
NORTH  | P2       |    1    |
NORTH  | P3       |    2    |
NORTH  | P4       |    2    |
NORTH  | P5       |    3    |
EAST   | P6       |    1    |
EAST   | P7       |    1    |
EAST   | P8       |    2    |
CENTRAL| P9       |    1    |
CENTRAL| P10      |    1    |
CENTRAL| P11      |    2    |
CENTRAL| P11      |    2    |
-------|----------|---------|

使用以下查询:

select 
Route, ParcelId
    -- calculate the group number for every 2 parcels, increment 1
    ceiling(row_number() over(partition by route order by ParcelId) / 2.0) GroupId
from Parcel (nolock)
where
    ship_date = cast(getdate() as date)

这里北线的Parcel P1,P2和东线的P6,P7有相同的GroupId。 但是我想要基于路线的包裹上的唯一标识符,即不仅仅是 1/2/3.. 如果我能得到 N1、N2、N3(对于北线)和 E1、E2(对于东线),这将对我有帮助在袋子里整理包裹。

所以我希望结果集应该如下所示:

Route  | ParcelId | GroupId |
-------|----------|---------
NORTH  | P1       |    N1   | 
NORTH  | P2       |    N1   |
NORTH  | P3       |    N2   |
NORTH  | P4       |    N2   |
NORTH  | P5       |    N3   |
EAST   | P6       |    E1   |
EAST   | P7       |    E1   |
EAST   | P8       |    E2   |
CENTRAL| P9       |    C1   |
CENTRAL| P10      |    C1   |
CENTRAL| P11      |    C2   |
CENTRAL| P11      |    C2   |
-------|----------|---------|

如果不完全 N1/E1/C1.. 标识符应该是唯一的(基于路线)并且我需要更新 Parcel table 上的一些空字段,因此需要相同的更新脚本。

如有线索,我们将不胜感激。

谢谢,

select 
Route, ParcelId,CONCAT(CASE WHEN ROUTE='NORTH' THEN 'N' WHEN ROUTE='EAST' THEN 'E' WHEN ROUTE='WEST' THEN 'W' WHEN ROUTE='SOUTH' THEN 'S' WHEN ROUTE='CENTRAL' THEN 'C' END,GroupId) AS GroupId 
from Parcel 
where ship_date = cast(getdate() as date)

您可以试试上面的查询。