SQL Server滞后和领先

问题描述 投票:0回答:1

我正在使用SQL Server 2014。

我有一张桌子:

CREATE TABLE [dbo].tmpJobStatus(
    [JobNum] [int] NOT NULL,
    [Action] [varchar](8) NULL,
    [ActionDate] [date] NULL,
    [SeqNum] [int] NULL
) ON [PRIMARY]

我有一些数据:

INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (12345, N'TEL', CAST(N'2019-07-05' AS Date), 19)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (12345, N'AL2', CAST(N'2019-07-02' AS Date), 15)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (12345, N'AL1', CAST(N'2019-05-28' AS Date), 8)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (12345, N'TELA', CAST(N'2019-05-16' AS Date), 2)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (6789, N'MAIN', CAST(N'2019-11-04' AS Date), 25)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (6789, N'MAIN', CAST(N'2019-11-04' AS Date), 21)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (6789, N'TEL', CAST(N'2019-10-29' AS Date), 20)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (6789, N'MACO', CAST(N'2019-10-28' AS Date), 13)
INSERT tmpJobStatus ([JobNum], [Action], [ActionDate], [SeqNum]) VALUES (6789, N'UCIN', CAST(N'2019-09-12' AS Date), 11)

如果我使用下面的一项作业执行滞后铅,则将获得所需的结果:

  SELECT
[JobNum],
[ActionDate],
[SeqNum],
LAG(p.[Action]) OVER (ORDER BY p.[JobNum],p.[SeqNum]) FromActionCode,
LEAD(p.[Action]) OVER (ORDER BY p.[JobNum],p.[SeqNum]) ToActionCode
FROM [tmpJobStatus] p
where [JobNum] = 6789
order by p.[JobNum],p.[SeqNum] desc

结果:

JobNum  ActionDate  SeqNum  FromActionCode  ToActionCode
6789    2019-11-04  25    MAIN          NULL
6789    2019-11-04  21    TEL           MAIN
6789    2019-10-29  20    MACO          MAIN
6789    2019-10-28  13    UCIN          TEL
6789    2019-09-12  11    NULL          MACO

注意第一个FromActionCode和LastToCode的NULL,这是正确的。

但是,如果我查看所有记录,就会搞砸了:

JobNum  ActionDate  SeqNum  FromActionCode  ToActionCode
6789    2019-11-04  25    MAIN              TELA
6789    2019-11-04  21    TEL               MAIN
6789    2019-10-29  20    MACO              MAIN
6789    2019-10-28  13    UCIN              TEL
6789    2019-09-12  11    NULL              MACO
12345   2019-07-05  19    AL2               NULL
12345   2019-07-02  15    AL1               TEL
12345   2019-05-28  8     TELA              AL2
12345   2019-05-16  2     MAIN              AL1

我想念什么?

sql sql-server tsql lag lead
1个回答
1
投票

您尝试使用PARTITION

SELECT [JobNum], [ActionDate], [SeqNum],
       LAG(p.[Action]) OVER (PARTITION BY p.[JobNum] ORDER BY p.[SeqNum]) FromActionCode,
       LEAD(p.[Action]) OVER (PARTITION BY p.[JobNum] ORDER BY p.[SeqNum]) ToActionCode
FROM [tmpJobStatus] p
ORDER BY p.[JobNum],p.[SeqNum] desc
© www.soinside.com 2019 - 2024. All rights reserved.