Точная сортировка имен дат по разделам

#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
  

Результаты:

Смотрите демонстрацию здесь

Однако я открыт для лучших предложений 🙂