簡體   English   中英

SQL 服務器滯后和領先

[英]SQL Server Lag and Lead

我正在使用 SQL 服務器 2014。

我有一張桌子:

CREATE TABLE [dbo].tmpJobStatus
(
    [JobNum] [INT] NOT NULL,
    [Action] [VARCHAR](8) NULL,
    [ActionDate] [DATE] NULL,
    [SeqNum] [INT] NULL
) ON [PRIMARY]

我有一些數據:

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

如果我對一項工作使用以下內容執行LAGLEAD ,我會得到所需的結果:

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

我錯過了什么?

你試過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM