#tsql #sql-server-2017
#tsql #sql-server-2017
Вопрос:
У меня есть следующие данные:
with cte (id,[months]) as (
select 1, 'July 2019' union all
select 2, 'July 2019' union all
select 3, 'July 2019' union all
select 4, 'July 2019' union all
select 5, 'Au&ust 2019' union all
select 6, 'Au&ust 2019' union all
select 7, 'September 2019' union all
select 8, 'October 2019' union all
select 9, 'November 2019' union all
select 10, 'December 2019' union all
select 11, 'January 2020' union all
select 12, 'January 2020' union all
select 13, 'January 2020' union all
select 14, 'January 2020' union all
select 15, 'February 2020' union all
select 16, 'March 2020' union all
select 17, 'March 2020' union all
select 18, 'April 2020' union all
select 19, 'May 2020' union all
select 20, 'June 2020'
)
Мне требуется создать столбец сортировки, который занимает одинаковое место months
с одинаковым номером.
Проблема, с которой я столкнулся со следующим кодом, заключается в том, что он неправильно сортируется, а также не дает мне ожидаемых результатов:
select
*
, dense_rank() over (partition by months order by id) Sort
from cte
Текущие результаты:
Мои ожидаемые результаты:
Как я должен изменить свой скрипт для достижения этого?
Комментарии:
1. Если у вас есть какая-либо возможность повлиять на модель данных, вам следует предложить изменить ее. Это ужасный способ хранения любых данных, связанных с датой, которые, как ожидается, будут полезны в качестве даты.
2. Спасибо за внимание @EricBrandt.
Ответ №1:
После долгих усилий мне удалось решить эту проблему с помощью этого скрипта:
select
*
, convert(date,'01 ' Months) MonthsConvertedToDate
, dense_rank() over (order by convert(date,'01 ' Months)) Sort
from cte
order by sort,id
Результаты:
Смотрите демонстрацию здесь
Однако я открыт для лучших предложений 🙂