使用group按另一列值更新列值

时间:2017-08-31 11:52:31

标签: mysql row-number

我正在为快递服务解决一个问题,他们有不同的路线,每条路线可以有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。 但是我希望Parcel上的唯一标识符基于Route而不是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表上的一些空字段,那么将需要更新脚本。

任何领导都将受到赞赏。

谢谢,

1 个答案:

答案 0 :(得分:0)

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)

您可以尝试以上查询。