SQL Server 具有LEAD / LAG的内部连接相同表

q5iwbnjs  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(140)

我有以下数据

我需要的是这样的东西

有可能得到这样的数据吗?
我做了一些研究,并获得洞察力使用领先/滞后函数,但结果并不在意料之中,这是我尝试

SELECT Id, Username, Distributor, 
    LEAD(Id) OVER (PARTITION BY Username ORDER BY Id) AS IdNew,
    LEAD(Distributor) OVER (PARTITION BY Username ORDER BY Id) AS IdNew 
FROM UserDist

--更新--
如@gotqn所述,是,我已经尝试为具有相同Id的每个数据添加唯一密钥
例如,我想从seq = 1用户名joe获取数据

DROP Table IF EXISTS #Temp 
CREATE TABLE #Temp
(
    Seq INT,
    Id INT,
    Username NVARCHAR(100),
    Distributor NVARCHAR(100)
)

INSERT INTO #Temp(Seq, Id, Username, Distributor)
select DENSE_RANK() OVER (PARTITION BY Username  ORDER BY IdDum) AS Seq,
Id, Username, Distributor
from UserDist

select * from #Temp A

Seq Id  Username    Distributor
1   1   Joe         RNN
1   1   Joe         CNN
1   1   Joe         SSN
2   2   Joe         DSS
2   2   Joe         DDK
3   4   Joe         GER
3   4   Joe         RIG
3   4   Joe         POL
3   4   Joe         MOD
1   3   Kelly       OPK
1   3   Kelly       DLC
2   5   Kelly       DERMA
2   5   Kelly       KOI
2   5   Kelly       DELL

而不是像返回我需要的,它返回冗余数据

select * from #Temp A LEFT  JOIN #Temp B ON A.Username = B.Username AND A.Seq + 1 = B.Seq
WHERE A.Seq = 1 AND A.Username = 'Joe'

Seq Id  Username    Distributor Seq Id  Username    Distributor
1   1   Joe         RNN         2    4  Joe         DSS
1   1   Joe         RNN         2    5  Joe         DDK
1   2   Joe         CNN         2    4  Joe         DSS
1   2   Joe         CNN         2    5  Joe         DDK
1   3   Joe         SSN         2    4  Joe         DSS
1   3   Joe         SSN         2    5  Joe         DDK
nuypyhwy

nuypyhwy1#

这是不可能的,因为您无法以唯一的方式对每个用户的数据进行排序。您需要有附加列(例如row - id)。它不必是表定义的一部分,您可以使用ROW_NUMBER计算它,如下所示:

SELECT ROW_NUMER() OVER (PARTITION BY Username ORDER BY ... some unique criteria ...)

然后对数据进行排序,您只需要加入到数据本身,如下所示:

SELECT *
FROM OrderedData DS1
LEFT JOIN OrderedData DS2
   ON DS1.[row_id] + 1 = DS2.[row_id]

以上将是基本查询。

相关问题