Вы можете использовать хитрость, воспользовавшись тем фактом, что максимальное число недель (52 или 53) меньше максимального числа минут (59). Даже если ваше первое число представляет неделю, просто ради этого запроса представьте, что оно представляет собой минуту. Затем вы можете конвертировать между строковыми типами данных и датами, используя неполную модель формата даты ('mi_yyyy'). Oracle предоставляет значения по умолчанию для других компонентов: текущий месяц для 'mm'
, день 01
для 'dd'
, час 00
для часа, секунды 00
для секунды. Затем вы можете упорядочить по «дате», построенной таким образом - порядок будет таким же, независимо от того, является ли первый компонент «номером недели» или «номером часа».
Это было бы намного проще, если бы Oracle позволял модель формата даты 'iw_yyyy'
, но это не так.
Также обратите внимание, что - поскольку мы хотим отображать вывод в убывающем порядке - я использую убывающий порядок в функции analyti c (и поэтому, Я должен использовать lead()
вместо lag()
). Это позволяет избежать необходимости дважды сортировать строки (один раз в порядке возрастания для функций analyti c, а затем снова в порядке убывания для окончательного вывода).
Как я сказал в комментарии к вашему вопросу, Я считаю, что требование проблемы неверно; вам нужно, чтобы результат был показан ниже в my_column
. На всякий случай я включил в вывод и «мой», и запрошенный столбец; удалите тот, который вам не нужен, после того, как вы должным образом рассмотрите мой комментарий.
with
sample_data(column1) as (
select '2_2020' from dual union all
select '1_2020' from dual union all
select '52_2019' from dual
)
select column1,
lead(column1)
over (order by to_date(column1, 'mi_yyyy') desc) as my_column,
to_char(lead(to_date(column1, 'mi_yyyy'))
over (order by to_date(column1, 'mi_yyyy') desc), 'fmmi') as column3
from sample_data
;
COLUMN1 MY_COLUMN COLUMN3
--------- --------- ---------
2_2020 1_2020 1
1_2020 52_2019 52
52_2019