Определите самую последнюю запись по годовому снимку по разделу Arrange Id - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть сценарий, как показано ниже, и я хочу установить индикатор на основе Arrange Id, даты входа. Если пользовательский веб-сайт входа в систему несколько раз в календарном году, то для самой последней записи необходимо установить Y, еще N. Также мне нужно установить индикатор, как внизу два также и строки .. (Имеется в виду 1121221, к которым обращались в последний год, последние 12.12.2017 г., необходимо установить «Y», а если пользователь получил доступ в следующем ближайшем году 1/12/2018, то «Y»)

введите описание изображения здесь

1 Ответ

0 голосов
/ 20 апреля 2019

Вот один из вариантов.Что он делает?

  • TEST CTE - это несколько примеров строк.Примечание ARRANGE_ID = 999 с датами 2017 и 2019 гг. (Это означает, что нет последовательных лет, поэтому дата в 2019 г. должна иметь показатель «N»). Однако вы не сказали, что произойдет, если есть еще одиндата в 2019 году, получат ли они оба 'N', или максимальная дата входа все еще получит 'Y'?
  • * CTE INTER использует аналитическую функцию MAX для определения максимальной даты входадля года и аналитической функции LAG, которая возвращает предыдущую дату входа в систему (чтобы я мог проверить, являются ли эти годы последовательными или нет)
  • В последнем запросе используется CASE, чтобы найти, удовлетворяет ли определенная строка условиямчтобы сделать индикатор равным 'Y'

Вот, пожалуйста:

SQL> with test (arrange_id, login_date) as
  2    (select 234, date '2017-02-18' from dual union all
  3     select 234, date '2017-04-13' from dual union all
  4     select 234, date '2017-11-14' from dual union all
  5     select 234, date '2018-01-14' from dual union all
  6     select 234, date '2018-09-11' from dual union all
  7     select 234, date '2019-04-02' from dual union all
  8     select 234, date '2019-05-18' from dual union all
  9     select 112, date '2017-02-23' from dual union all
 10     select 112, date '2017-12-13' from dual union all
 11     select 112, date '2018-01-12' from dual union all
 12     select 999, date '2017-01-01' from dual union all
 13     select 999, date '2017-05-25' from dual union all
 14     select 999, date '2019-01-01' from dual
 15    ),
 16  inter as
 17    (select arrange_id,
 18       login_date,
 19       max(login_date) over
 20         (partition by arrange_id, extract (year from login_date)) maxdate,
 21       lag(login_date) over (partition by arrange_id order by login_date) prev_date
 22     from test
 23    )
 24  select arrange_id,
 25    login_date,
 26    case when login_date = maxdate and
 27              extract(year from login_date) - extract(year from prev_date) <= 1 then 'Y'
 28         else 'N'
 29    end indicator
 30  from inter
 31  order by arrange_id, login_date;

ARRANGE_ID LOGIN_DATE I
---------- ---------- -
       112 02/23/2017 N
       112 12/13/2017 Y  -- Y because it is MAX in 2017
       112 01/12/2018 Y  -- Y because it is MAX in 2018 and 2018 follows 2017
       234 02/18/2017 N
       234 04/13/2017 N
       234 11/14/2017 Y  -- Y because it is MAX in 2017
       234 01/14/2018 N
       234 09/11/2018 Y  -- Y because it is MAX in 2018 and 2018 follows 2017
       234 04/02/2019 N
       234 05/18/2019 Y  -- Y because it is MAX in 2019 and 2019 follows 2018
       999 01/01/2017 N
       999 05/25/2017 Y  -- Y because it is MAX in 2017
       999 01/01/2019 N  -- N because it is MAX in 2019, but 2019 doesn't follow 2017

13 rows selected.

SQL>
...