САМО СОЕДИНЕНИЕ совпадающих строк на основе иерархии - PullRequest
0 голосов
/ 10 ноября 2019

В приведенном ниже запросе я пытаюсь сопоставить это подмножество строк, чтобы я мог сделать DATEDIFF между датой окончания 1-й записи и датой реального времени 2-й записи;затем то же самое с DATEDIFF между 2-й и 3-й записью. Это должно продолжаться до тех пор, пока последняя запись не будет иметь конечную дату NULL, поскольку это может быть случай с 2,3,4,5 ... строками, с которыми это нужно сделать. Для сравнения необходимо, чтобы код местоположения и код группы продуктов были одинаковыми, а затем иметь порядок, согласно которому 1-я запись является самым ранним, а последняя запись имеет самый старый. Хотя я не могу выработать логику вообще. Любая помощь будет принята с благодарностью.

В настоящее время у меня есть предложение WHERE для определенного кода местоположения / кода продукта исключительно с точки зрения тестирования, поскольку набор результатов будет большим и громоздким для тестирования.

SELECT wpa1.[id] 'WPA1_ID', 
       wpa2.[id] 'WPA2_Id',     
       wpa1.[planogramucr], 
       wpa1.[locationproductgroupucr], 
       wpa1.[locationcode], 
       wpa1.[productgroupcode], 
       wpa1.[categoryname], 
       wpa1.[assignmentstatus],
       wpa1.[livedate], 
       wpa1.[enddate], 
       DATEDIFF(day, wpa1.EndDate, wpa2.LiveDate) AS 'DateDiff_bet_live_end',
       wpa1.[lastmodifieddate] 
FROM   [Staging].[CustomerWorkAround].[customerplanasscc] wpa1 
       JOIN [CustomerWorkAround].[customerplanasscc] wpa2
       ON wpa1.Id = wpa2.Id
       AND wpa1.PlanogramUCR = wpa2.PlanogramUCR
       AND wpa1.LocationProductGroupUCR = wpa2.LocationProductGroupUCR
WHERE wpa1.EndDate IS NOT NULL -- Don't need enddates in the first table
AND wpa1.LocationCode = 102
AND wpa1.ProductGroupCode = 38
ORDER  BY  wpa1.locationcode, 
           wpa1.productgroupcode, 
           wpa1.livedate;

Это пример набора результатов:

**WPA1_ID   WPA2_Id planogramucr    locationproductgroupucr locationcode    productgroupcode    categoryname    assignmentstatus    livedate    enddate DateDiff_bet_live_end   lastmodifieddate**
8586    8586    7d82d260-820b-4d7e-ab2d-594b6c6cefba    66ca4c51-b7d8-4943-b3c7-b69be010d2b9    102 38  FRESH MEAT - PORK   0   2019-09-24T00:00:00 2019-11-01T00:00:00 -38 2019-09-24T08:47:36
8773    8773    880c9242-9bca-4c5c-8a91-131c720d4b37    66ca4c51-b7d8-4943-b3c7-b69be010d2b9    102 38  FRESH MEAT - PORK   1   2019-11-01T00:00:00 2019-11-30T00:00:00 -29 2019-09-24T08:47:36
8860    8860    66948c90-022e-46a3-9f06-fc26e1d9d3a0    207b6ca4-fb7d-4c9e-9a19-da8a06a51e31    102 38  FRESH MEAT - PORK   1   2019-11-30T00:00:00     43797   2019-09-24T08:47:41

1 Ответ

2 голосов
/ 10 ноября 2019

Я бы попробовал что-то в этом роде:

 select
     [id] as 'WPA1_ID'
     LEAD([id],1) over (order by livedate) as 'WPA2_ID'
     <stuff>
     DATEDIFF(day, EndDate, LEAD(LiveDate,1) over (partition by locationcode, productgroupcode order by livedate)) as DateDiff_bet_live_end
 from 
     [Staging].[CustomerWorkAround].[customerplanasscc] wpa1 
 where 
     <stuff>

Так что использование LEAD (или LAG, который когда-либо дает число, за которым вы идете) позволит вам продвинуться вперед(или позади) того, на кого вы смотрите по указанному номеру.

https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15

Это может быть не полный ответ, но, надеюсь, это даст вам новое место для начала

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