Запрос на поиск изменений в строке по сравнению с предыдущей строкой в ​​запросе SQL - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть таблица per_all_Assignments_f с date_from и date_to и следующей структурой столбца:

PERSON_ID     DATE_FROM         DATE_TO      GRADE
---------    ------------      -----------   -----
12            01-Jan-2018      28-Feb-2018     c
12            01-Mar-2018      29-Mar-2018     a
12            30-Mar-2018      31-dec-4712     b
13            01-jan-2018      31-dec-4712     c

В приведенной выше таблице я должен получить последнее изменение оценки, т.е. для person_id'12', я должен извлечь обе строки записи: от 30-mar-2018 до 31 dec 4712, являющуюся последней и одной предыдущей строкой.Какую функцию я могу использовать для этого?

решено с помощью:

SELECT person_id,
       asg.grade_id,
       lag(asg.grade_id) Over (Partition By person_ID Order By start_date) as prev_ppg_line1,
       lag(start_date) Over (Partition By person_ID Order By start_date) 
                                                            as prev_ppg_effective_start_date,
       start_date,
       row_Number() Over (Partition By person_ID Order By effective_start_date) as rn
  FROM asg_table asg
 WHERE person_id = 12;

Этот запрос извлечет 3 строки со всеми предыдущими изменениями.Я хочу получить только последние изменения, не используя максимальную дату вступления в силу

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете использовать вместе аналитические функции row_number и lead внутри подзапроса:

select person_id, date_From, date_to, grade
  from
  (
    with per_all_Assignments_f(person_id, date_From, date_to, grade) as
    (
     select 12,date'2018-01-01',date'2018-02-28','c' from dual union all
     select 12,date'2018-03-01',date'2018-03-29','a' from dual union all
     select 12,date'2018-03-30',date'4172-12-31','b' from dual union all
     select 13,date'2018-01-01',date'4172-12-31','c' from dual  
    )
    select t.*,
           lead(grade) over (order by date_From desc) as ld,
           row_number() over (order by date_From desc) as rn 
      from per_all_Assignments_f t
  )   
  where rn <= 2
    and grade != ld
  order by rn desc;

 PERSON_ID  DATE_FROM    DATE_TO    GRADE
 ---------- ----------- ---------- -------
     12     01.03.2018  29.03.2018    a
     12     30.03.2018  31.12.4172    b

Rextester Demo

0 голосов
/ 26 декабря 2018

Похоже, вы просто хотите, чтобы все с row_number() из 1 или 2 были разделены человеком и упорядочены по убыванию.

SELECT person_id,
       date_from,
       date_to,
       grade
       FROM (SELECT person_id,
                    date_from,
                    date_to,
                    grade,
                    row_number() OVER (PARTITION BY person_id
                                       ORDER BY date_from DESC) rn
                    FROM per_all_assignments_f t) x
       WHERE rn IN (1, 2)
       ORDER BY person_id ASC,
                date_from DESC;
...