2017-01-24 2 views
0

Я постараюсь это как можно лучше. Я знаю, что вы помогаете, когда вы также понимаете вопрос :)Возвращаемые строки с одинаковым идентификатором после определенного статуса

У меня есть столбец с различным ApplicationStatus с тем же ApplicationID. Когда ApplicationStatus достигает «Аудит завершен» в первый раз, и есть какая-либо деятельность ПОСЛЕ того, что тогда он должен возвращать эти ApplicationStatuses (даже если «Complete Complete» снова появляется после «Complete Complete» ApplicationStatus. Затем, когда «Audit Complete» не появляются в группе ApplicationID-х, то он должен также не возвращать эти строки

My Table

Это то, что я хотел бы вернуться (остальные столбцы не имеют каких-либо проблем).

  ApplicationID | Application Status 
      ----------------|-------------------- 
       926521  | Submitted to Bank 
       926521  | Audit Complete 

Первый «Application Complete» ApplicationStatus может отображаться в любой строке группы ApplicationID.

Вот код, который я попробовал (Дайте мне знать, если вы хотите, чтобы я сократить код (я просто хотел показать вам, что я пробовал):

WITH CTE 
AS 
(
SELECT 
     status.ApplicationID AS [Application ID], 
     ROW_NUMBER() OVER(PARTITION BY status.ApplicationID ORDER BY status.ApplicationID) AS [Row Number], 
     status.ApplicationStatusMovementID AS [Application Status Movement ID], 
     status.ApplicationStatus AS [Application Status], 
     status.Comment, 
     status.CreatedDate AS [Created Date], 
     app.BondFacilitator AS [Bond Facilitator], 

     CASE 
     WHEN COUNT(*) OVER(PARTITION BY status.ApplicationID) > 3 AND status.ApplicationStatus IN ('Audit Complete') --OR COUNT(*) OVER(PARTITION BY status.ApplicationID) > 3 
     THEN 'NO' 
     WHEN COUNT(*) OVER(PARTITION BY status.ApplicationID) > 3 AND status.ApplicationStatus NOT IN ('Audit Complete') --OR COUNT(*) OVER(PARTITION BY status.ApplicationID) > 3 
     THEN 'FINE' 
     ELSE 'FINE' 
     END AS [Status] 

FROM Import.OobaApplicationStatusMovement AS status 

LEFT OUTER JOIN Import.OobaApplication AS app ON status.ApplicationID = app.ApplicationID 

GROUP BY 
     status.ApplicationID, 
     ApplicationStatusMovementID, 
     status.ApplicationStatus, 
     Comment, 
     status.CreatedDate, 
     BondFacilitator 

) 
SELECT [Application ID], 
     [Row Number], 
     [Application Status Movement ID], 
     [Application Status], 
     Comment, 
     [Created Date], 
     [Bond Facilitator], 
     [Status], 

     IIF(COUNT(*) OVER(PARTITION BY [Application ID]) > COUNT([Status]) OVER(PARTITION BY [Application ID], [Status]), 'NO', 'YES') AS [Activity After Audit Completed] 


FROM (
    SELECT [Application ID], 
     [Row Number], 
     [Application Status Movement ID], 
     [Application Status], 
     Comment, 
     [Created Date], 
     [Bond Facilitator], 
     [Status], 

     IIF(COUNT(*) OVER(PARTITION BY [Application ID]) > COUNT([Status]) OVER(PARTITION BY [Application ID], [Status]), 'NO', 'YES') AS [Activity After Audit Completed] 


FROM CTE) AS result 

WHERE [Row Number] IN 
    (SELECT [Row Number] + i 
    FROM CTE 
    CROSS JOIN (SELECT 2 AS i UNION ALL SELECT 3 UNION ALL SELECT 15) AS n 
WHERE [Application Status] = 'Audit Complete') AND [Activity After Audit Completed] IN ('NO') AND Status IN ('FINE', 'NO') 


ORDER BY [Application ID], [Created Date] 

ответ

1

Может быть, я что-то пропустил или я не понял ваш вопрос правильно, но я думаю, что решение довольно просто. Пожалуйста, найдите следующий пример: сначала я определяю таблицу с несколькими примерами записей, затем я выбираю для отображения всех статусов, где «Аудит завершен», не последний статус:

DECLARE @t TABLE (Application_ID int, RowNumber int, ApplStatus nvarchar(50)); 

INSERT INTO @t VALUES (926521, 1, 'Work in Progress'), (926521, 2, 'Submitted to Bank'), (926521, 3, 'Audit Complete'), 
         (926521, 4, 'Submitted to Bank'), (926521, 5, 'Audit Complete'); 

INSERT INTO @t VALUES (933633, 1, 'Work in Progress'), (933633, 2, 'Submitted to Bank'), (933633, 3, 'Cancelled'), 
         (933633, 4, 'Submitted to Bank'), (933633, 5, 'Audit Complete'); 

WITH cteRows AS(
    SELECT Application_ID 
     ,ApplStatus 
     ,MIN(RowNumber) OVER (PARTITION BY Application_ID, ApplStatus) rnMinStatus 
     ,MAX(RowNumber) OVER (PARTITION BY Application_ID) rnMax 
    FROM @t 
), 
cteFiltered AS(
    SELECT * 
    FROM cteRows 
    WHERE ApplStatus = 'Audit Complete' 
     AND rnMinStatus < rnMax 
) 
SELECT DISTINCT a.Application_ID, a.ApplStatus 
    FROM @t AS a 
    JOIN cteFiltered AS b ON a.Application_ID = b.Application_ID 
    WHERE a.RowNumber > b.rnMinStatus 
+0

Добро пожаловать, , Рад, что смог помочь. Было бы здорово, если бы вы согласились с моим ответом. – Tyron78

Смежные вопросы