Oracle SQL получить самую последнюю строку для каждого идентификатора - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть следующий запрос, который возвращает список участников с их идентификатором и датами начала и окончания в качестве клиентов. Я пытаюсь как увидеть, есть ли разрыв в охвате их клиентов, так и покрыты ли они в настоящее время. Способ покрытия состоит в том, что каждый месяц существует строка, в которой говорится, что по состоянию на этот месяц они охватываются или не покрываются, поэтому каждый идентификатор имеет много строк. Я хочу закончить только одной строкой для идентификатора, которая содержит информацию о том, покрыты ли они в настоящее время и есть ли у них пробел в членстве

текущий код:

SELECT distinct ID,
                location,
                start_dt,
                end_dt,
                county,
                city,
                MBR_GAP,

                case
                    when end_dt < DATE '2020-01-01' then 'N'
                    else 'Y' end as Covered_as_of_today


from (SELECT T2.*,
             CASE
                 WHEN T2.DELTA_YEAR = 0 AND T2.DELTA_MONTH > 1 THEN 'Y'
                 WHEN T2.DELTA_YEAR > 1 THEN 'Y'
                 WHEN T2.DELTA_YEAR = 1 AND T2.DELTA_MONTH > -11 THEN 'Y'
                 ELSE 'N' END                      AS MBR_GAP,
             (T2.YEAR - T2.DELTA_YEAR)             AS PRE_YEAR,
             (T2.MONTH - T2.DELTA_MONTH)           AS PRE_MONTH,
             CASE
                 WHEN LENGTH((T2.MONTH - T2.DELTA_MONTH)) = 1
                     THEN (T2.YEAR - T2.DELTA_YEAR) || '0' || (T2.MONTH - T2.DELTA_MONTH)
                 ELSE (T2.YEAR - T2.DELTA_YEAR) || (T2.MONTH - T2.DELTA_MONTH)
                 END                               AS PRE_CALENDAR,
             (T2.DELTA_YEAR * 12 + T2.DELTA_MONTH) AS GAP_MONTHS

      FROM (SELECT DISTINCT MBRSHP_MTH_NB,
                            ID,
                            location,
                            start_dt,
                            end_dt,
                            county,
                            city,
                            MED_CVRG_IN_CD,
                            YEAR,
                            MONTH,
                            YEAR - LAG(YEAR) OVER (PARTITION BY ID ,location ORDER BY MBRSHP_MTH_NB )   AS DELTA_YEAR,
                            MONTH - LAG(MONTH) OVER (PARTITION BY ID ,location ORDER BY MBRSHP_MTH_NB ) AS DELTA_MONTH


            FROM (
                     select DISTINCT MBRSHP_MTH_NB,
                                     location,
                                     ID,
                                     start_dt,
                                     end_dt,
                                     county,
                                     city,
                                     SUBSTR(Member_month, 1, 4)  AS YEAR,
                                     SUBSTR(MBRSHP_MTH_NB, 5, 2) AS MONTH,
                                     MED_CVRG_IN_CD


                     from MEMBERS
                     where MEMBERS.ID in (1354468, 1354654
                         )
                     order by ID
                 ) T1) T2)

, он выводит это:

ID location start_dt    end_dt     county        city        MBR_GAP covered_as_of_today
1354468 TY  01-OCT-19   31-DEC-19   Location A  Location A-1    N   N
1354468 TY  01-OCT-19   31-DEC-20   Location A  Location A-1    N   Y
1354468 TY  01-JAN-20   31-DEC-20   Location A  Location A-1    N   Y
1354654 TY  01-JAN-19   31-DEC-20   Location A  Location A-2    N   Y
1354654 TY  01-JAN-16   31-DEC-18   Location A  Location A-2    N   N
1354654 TY  01-JAN-16   31-DEC-20   Location A  Location A-2    N   Y

что я хочу:

ID location start_dt    end_dt     county        city        MBR_GAP covered_as_of_today
1354468 TY  01-JAN-20   31-DEC-20   Location A  Location A-1    N   Y
1354654 TY  01-JAN-19   31-DEC-20   Location A  Location A-2    N   Y


Я пытался добавить max для даты начала и окончания, но это дает тот же результат, я думаю, из-за других столбцов

1 Ответ

3 голосов
/ 06 февраля 2020

Используйте CTE и row_number():

with cte as (
      <your query here>
     )
select cte.*
from (select cte.*,
             row_number() over (partition by id order by startdt desc) as seqnum
      from cte
     ) cte
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...