Как устранить претензии с ClaimStatus = 1 на основе даты активности.SQL Server 2012 - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 3 разных утверждения в моем наборе данных.

ClaimStatus может быть только 1 или 0. Это означает, что открыто (0) или закрыто (1).

Как устранить те претензии, которые имеют последние ClaimStatus = 1.

enter image description here

Я пытался использовать функцию Last_Value в своем предложении WHERE, но получил ошибку:

Оконные функции могут толькопоявляются в предложениях SELECT или ORDER BY

Результат запроса должен возвращать только Claim2, поскольку ClaimStatus все еще открыто:

enter image description here

код:

declare @TempTable table 
                   (
                        ClaimNumber varchar(50), 
                        ActivityID int, 
                        Activity varchar(50), 
                        ActivityDate datetime, 
                        ClaimStatus int
                   )

insert into @TempTable 
values ('Claim1', 0, 'ClaimCreated', '2018-05-04 10:58:56.510', 0),
       ('Claim1', 4, 'ReserveCreated', '2018-05-09 09:52:52.327', 0),
       ('Claim1', 6, 'PaymentCreated', '2018-05-15 13:17:47.920', 0),
       ('Claim1', 8, 'ClaimClosed', '2018-11-01 10:53:00.087', 1),
       ('Claim2', 0, 'ClaimCreated', '2018-05-04 10:58:56.510', 0),
       ('Claim2', 4, 'ReserveCreated', '2018-05-09 09:52:52.327', 0),
       ('Claim2', 6, 'PaymentCreated', '2018-05-15 13:17:47.920', 0),
       ('Claim3', 0, 'ClaimCreated', '2018-05-04 10:58:56.510', 0),
       ('Claim3', 4, 'ReserveCreated', '2018-05-09 09:52:52.327', 0),
       ('Claim3', 6, 'PaymentCreated', '2018-05-15 13:17:47.920', 0),
       ('Claim3', 8, 'ClaimClosed', '2018-11-01 10:53:00.087', 1)

select *
from @TempTable
where LAST_VALUE(ClaimStatus) over (partition by ClaimNumber order by ActivityDate desc) <> 1

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Как говорит ошибка, вы не можете поместить LAST_VALUE в WHERE, но вы можете поместить его в SELECT CTE, а затем сослаться на это в WHERE:

WITH CTE AS(
    SELECT ClaimNumber,
           ActivityID,
           Activity,
           ActivityDate,
           ClaimStatus,
           LAST_VALUE(ClaimStatus) OVER (PARTITION BY ClaimNumber ORDER BY ActivityDate
                                         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LatestStatus
    FROM @TempTable)
SELECT ClaimNumber,
       ActivityID,
       Activity,
       ActivityDate,
       ClaimStatus
FROM CTE
WHERE LatestStatus != 1;
0 голосов
/ 27 ноября 2018

Если я правильно читаю ваш вопрос, похоже, что вас интересует выяснение того, является ли последний статус претензии закрытым.Если это правильно, нам просто нужно найти последнюю запись и затем проверить ее статус.Кажется, это работает:

SELECT
  tt.ClaimNumber,
  tt.ClaimStatus
FROM
  @TempTable AS tt
JOIN
  (
    SELECT
      t.ClaimNumber
     ,MAX(t.ActivityDate) AS LastActivity
    FROM
      @TempTable AS t
    GROUP BY
      t.ClaimNumber
  )          AS s
    ON
    s.ClaimNumber = tt.ClaimNumber
      AND s.LastActivity = tt.ActivityDate
WHERE
  tt.ClaimStatus <> 1;

Результаты:

+-------------+-------------+
| ClaimNumber | ClaimStatus |
+-------------+-------------+
| Claim2      |           0 |
+-------------+-------------+
0 голосов
/ 27 ноября 2018

DEMO SQL

WITH cte as (
    SELECT ClaimNumber, 
           ClaimStatus,
           ROW_NUMBER() over (PARTITION BY ClaimNumber ORDER BY ActivityDate DESC) as rn
    FROM @TempTable
)
SELECT t.*
FROM @TempTable t
JOIN (SELECT *
      FROM cte
      WHERE rn = 1) f
  ON t.ClaimNumber = f.ClaimNumber
 AND f.ClaimStatus = 0

ВЫХОД

enter image description here

Дополнительно, если только 2 статуса вы также можете сделать

WITH cte as (
    SELECT ClaimNumber
    FROM @TempTable
    GROUP BY ClaimNumber
    HAVING MAX(ClaimStatus) = 0
)
SELECT t.*
FROM @TempTable t
WHERE ClaimNumber IN (SELECT * FROM cte)
...