使用按另一个列值分组更新列值
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)
您可以试试上面的查询。
我正在解决一个快递服务的问题,他们有不同的路线,每条路线可以有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)
您可以试试上面的查询。