Группируйте записи за последние 6 недель, найдите самую последнюю запись на основе даты в oracle - PullRequest
1 голос
/ 03 апреля 2020

Мне нужна помощь для создания запроса sql, чтобы получить самую последнюю серийную запись после сортировки по дате в порядке убывания за период в предыдущие 6 недель. Я смог сделать это в течение одного месяца без каких-либо проблем. Но я не могу придумать, как это сделать в предыдущие шесть недель. Я читал, что диапазон между предыдущей и текущей строкой может быть использован для достижения этой цели, но у меня ничего не получилось.

Это пример данных:

Источник: Случайные данные с 21 февраля по 20 и 3-апр-20 (предыдущие шесть недель с текущего дня)

Serial  Repair_dt
1       3-Apr-20
1       12-Mar-20
2       12-Mar-20
3       12-Mar-20
4       28-Feb-20
4       1-Mar-20
4       2-Apr-20
4       3-Apr-20
5       23-Feb-20
5       19-Mar-20
6       1-Mar-20

Позиция для поиска последней записи на основе даты des c, сгруппированной по сериалу:

Serial  Repair_dt   rank
1       3-Apr-20    1
1       12-Mar-20   2
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
4       2-Apr-20    2
4       1-Mar-20    3
4       28-Feb-20   4
5       19-Mar-20   1
5       23-Feb-20   2
6       1-Mar-20    1

Окончательный вывод :

Serial  Repair_dt   rank
1       3-Apr-20    1
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
5       19-Mar-20   1
6       1-Mar-20    1

Благодарим вас за помощь.

Спасибо. Кав

1 Ответ

2 голосов
/ 03 апреля 2020

Тебе не нужен ранг для этого. Агрегация работает для данных, которые вы описали:

select serial, max(repair_dt) as repair_dt
from t
where repair_dt > sysdate - interval '42' day
group by serial;

Если вы хотите всю строку, то:

select t.*
from t
where t.repair_dt = (select max(t2.repair_dt)
                     from t t2
                     where t2.serial = t.serial and
                           t2.repair_dt > sysdate - interval '42' day
                    );

Или:

select t.*
from (select t.*,
             row_number() over (partition by serial order by repair_dt desc) as seqnum
      from t
      where t2.repair_dt > sysdate - interval '42' day
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...