SQL 服务器获取记录对

SQL Server Obtain Pairs of records

我正在尝试获取 "pairs" 条记录,但我无法弄清楚。

这是我的:

Id  TruckId LocationId  MaterialMode
145223  1198    19  43
145224  1199    19  43
145225  1200    19  43
145226  1198    20  43
145227  1199    20  43
145228  1200    20  43
145229  1199    21  46
145230  1198    21  46
145231  1200    21  46
145232  1198    22  46
145233  1199    22  46
145234  1200    22  46
145235  1198    19  43
145236  1199    19  43
145237  1200    19  43
145238  1198    20  43
145239  1199    20  43
145240  1200    20  43
145241  1199    21  46
145242  1198    21  46
145243  1200    21  46
145244  1198    22  46
145245  1199    22  46
145246  1200    22  46

我需要得到以下信息:

Id A    Id B
145223  145226
145224  145227
145225  145228
145229  145233
145230  145232
145231  145234
145235  145238
145236  145239
145237  145240
145241  145245
145242  145244
145243  145246

基本上在相同 material 模式下匹配 2 个位置之间的 TruckId

我试过:

SELECT 
 Id AS IdA, 
 Lead(Id, 1, NULL) OVER(PARTITION BY TruckId, MaterialMode ORDER BY Date) AS IdB
FROM T

这会产生:

Id A    Id B
145223  145226
145224  145227
145225  145228
*145226 145235
*145227 145236
*145228 145237
145229  145233
145230  145232
145231  145234
*145232 145242
*145233 145241
*145234 145243
145235  145238
145236  145239
145237  145240
145241  145245
145242  145244
145243  145246

带 * 的记录我不想要。如果一对匹配,则该记录不应是 "another match"

的一部分

我相信我理解你的问题,以下是解决方案。

解释: 我将数据行排序为开始点和结束点集,就像在间隙和孤岛问题中一样,然后加入一个开始 ID 和结束 ID 相同 material模式和卡车。

; with separationSet as
(
    select 
        *,
        dense_rank() 
            over( 
                partition by materialmode,truckid 
                order by locationid asc
                ) as r 
    from T 
)
, scoredSet as
(
    select 
        *, 
        row_number() 
            over(
                partition by materialmode,truckid,r 
                order by id
                ) as r2 
    from separationSet
)
, startToEndPairs as 
( 
    select 
        S.id as StartId,
        E.id  as EndId 
    from scoredSet S 
        join scoredSet E 
             on S.r=1 and E.r=2 
             and S.r2=E.r2
             and S.TruckId=E.TruckId 
             and S.materialmode=E.materialmode
)

select 
    * 
from starttoEndPairs 
order by StartId asc

See working demo