обновление с агрегацией - PullRequest
1 голос
/ 13 мая 2019

У меня есть эта таблица

SalesTable

ProdID SalesmanBeforeName SalesmanBeforeDT SalesmanCurrentName SalesmanCurrentDT SalesmanAfterName SalesmanAfterDT

1011   NULL               NULL             Tom                 5/5/2019 10:53:52 NULL              NULL
1012   NULL               NULL             John                5/5/2019 11:36:47 NULL              NULL
1011   NULL               NULL             Adam                5/5/2019 10:41:35 NULL              NULL
1011   NULL               NULL             Matt                5/5/2019 09:22:11 NULL              NULL
1012   NULL               NULL             Rita                5/5/2019 12:50:19 NULL              NULL
1012   NULL               NULL             Nash                5/5/2019 11:09:26 NULL              NULL

Я хочу заполнить нулевые значения продажами до и после

ProdID SalesmanBeforeName SalesmanBeforeDT SalesmanCurrentName SalesmanCurrentDT SalesmanAfterName SalesmanAfterDT

1011   Adam               5/5/19 10:41:35  Tom                 5/5/2019 10:53:52 NULL              NULL
1012   Nash               5/5/29 11:09:26  John                5/5/2019 11:36:47 Rita              5/5/19 12:50:19
1011   Matt               5/5/19 09:22:11  Adam                5/5/2019 10:41:35 Tom               5/5/19 10:53:52
1011   NULL               NULL             Matt                5/5/2019 09:22:11 Adam              5/5/19 10:41:35
1012   John               5/5/19 11:36:47  Rita                5/5/2019 12:50:19 NULL              NULL
1012   NULL               NULL             Nash                5/5/2019 11:09:26 John              5/5/19 11:36:47

Я пробовал это заявление об обновлении, но не смог

UPDATE S1
SET SalesmanBeforeName = S3.SalesmanCurrentName,
SalesmanBeforeDT = S3.SalesmanCurrentDT
FROM SalesTable S1 INNER JOIN (SELECT TOP 1 S2.ProdID, S2.SalesmanCurrentName, S2.SalesmanCurrentDT FROM SalesTable S2 WHERE S1.ProdID = S2.ProdID AND S2.SalesmanCurrentDT < S1.CurrentDT ORDER BY S2.SalesmanCurrentDT DESC) S3
ON S1.ProdID = S3.ProdID

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Это идеальное использование для функций LEAD и LAG, которые были добавлены в SQL Server 2012. Это гораздо более эффективно, чем самостоятельное объединение.

Я использую CTE ниже, чтобы сделать запрос очень понятным и легким для чтения.

WITH
CTE
AS
(
    SELECT
        ProdID
        ,SalesmanCurrentName
        ,SalesmanCurrentDT
        ,SalesmanBeforeName
        ,SalesmanBeforeDT
        ,SalesmanAfterName
        ,SalesmanAfterDT
        ,LEAD(SalesmanCurrentName) OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanAfterName
        ,LEAD(SalesmanCurrentDT)   OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanAfterDT
        ,LAG(SalesmanCurrentName)  OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanBeforeName
        ,LAG(SalesmanCurrentDT)    OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanBeforeDT
    FROM SalesTable
)
UPDATE CTE
SET
     SalesmanBeforeName = NewSalesmanBeforeName
    ,SalesmanBeforeDT   = NewSalesmanBeforeDT
    ,SalesmanAfterName  = NewSalesmanAfterName
    ,SalesmanAfterDT    = NewSalesmanAfterDT
;
-- SELECT * FROM CTE

Вы можете сначала прокомментировать часть UPDATE и запустить SELECT * FROM CTE, чтобы подтвердить правильность результатов, а затем выполнить UPDATE.

1 голос
/ 13 мая 2019

Вы можете использовать утверждение ниже:

UPDATE S1
   SET S1.SalesmanBeforeName = S2.SalesmanCurrentName,
       S1.SalesmanBeforeDT   = S2.SalesmanCurrentDT 
  FROM SalesTable as S1
  INNER JOIN SalesTable as S2 
     ON S1.ProdID = S2.ProdID
  WHERE S2.SalesmanCurrentDT < S1.SalesmanCurrentDT;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...