Создание периода даты из таблицы с месячными записями

Допустим, у нас есть таблица, которая выглядит так в SQL Server 2012:

YYYYMM | Mbr_ID | Product_ID ---------------------------- 201501 | 000001 | AA 201502 | 000001 | AA 201503 | 000001 | AB 201504 | 000001 | AA 201505 | 000001 | AA 201506 | 000001 | AA 

Будет несколько членов, и они могут переключаться на продукты несколько раз, но не в течение определенного месяца.

Я хочу превратить это в таблицу span, что-то вроде следующего:

 CMonth_Start | CMonth_End | Mbr_ID | Product_ID ----------------------------------------------- 201501 | 201502 | 000001 | AA 201503 | 201503 | 000001 | AB 201504 | 201506 | 000001 | AA 

Если я попытаюсь сделать это с помощью MIN (YYYYMM) и MAX (YYYYMM), я бы получил только первый диапазон (201501-201506) для первого продукта. Я знаю, что должен быть какой-то способ сделать это, и я уверен, что это что-то простое, но я просто не могу думать об этом прямо сейчас. Я был бы очень признателен за любую помощь, которую вы могли бы мне дать, спасибо за чтение!

Вы можете использовать следующий запрос:

 SELECT MIN(YYYYMM) AS CMonth_Start, MAX(YYYYMM) AS CMonth_End, Mbr_ID, Product_ID FROM ( SELECT Mbr_ID, Mbr_ID, Product_ID, ROW_NUMBER() OVER (PARTITION BY Mbr_ID ORDER BY YYYYMM) - ROW_NUMBER() OVER (PARTITION BY Mbr_ID, Product_ID ORDER BY YYYYMM) AS grp FROM mytable ) AS t GROUP BY Mbr_ID, Product_ID, grp 

grp идентифицирует срезы последовательных записей, имеющих одинаковое значение Product_ID для Mbr_ID . Используя это поле во внешнем запросе, мы можем получить значения MIN / MAX в YYYYMM за одно значение Product_ID для Mbr_ID .

Чтобы последовательно идентифицировать группы одинаковых значений, вы можете использовать разницу чисел строк:

 select mbr_id, product_id, min(yyyymm) as month_start, max(yyyymm) as month_end from (select t.*, (row_number() over (partition by mbr_id order by yyyymm) - row_number() over (partition by mbr_id, product_id order by yyyymm) ) as grp from t ) t group by mbr_id, grp, product_id; 

Чтобы понять, как это работает, просто запустите подзапрос, чтобы посмотреть, как grp значение grp .

  • (SQL) Определить позиции множественных вхождений строкового формата в поле
  • Недопустимое имя объекта с #tem_table
  • Оберните узел вокруг существующих узлов xml, используя XQuery
  • Распределенная транзакция базы данных и транзакция с перекрестными базами данных
  • SQL Server 2012 Установка или добавление полнотекстового поиска
  • Как установить значения с разными временными интервалами?
  • Создание групп с равномерным распределением по совокупности
  • Альтернатива «циклизации» в SQL?
  • ВЛЕВОЕ СОЕДИНИТЕЛЬНОЕ СОЕДИНЕНИЕ 3 стола
  • Диспетчер подключений SSIS Excel не удалось подключиться к источнику
  • Какой тип таблицы фактов / загрузочного решения для системы бронирования?
  • Interesting Posts

    Заполните новую идентификационную колонку с последовательными идентификаторами

    Программная запись в базу данных

    Наша хранимая процедура SQL Server «умирает» – но как я могу найти причину?

    Получение исторических запросов

    Преобразование хранимой процедуры Oracle в SQL Server

    Как синхронизировать два (или n) процесса репликации баз данных SQL Server?

    SQL. Создайте временную таблицу или CTE первого дня месяца и месяца.

    Руководство по чтению SQL Server Объясните план

    Сохраненный proc для возврата данных на основе столбцов с нулевым значением по приоритету

    Как установить значение строки в столбце SQL Server?

    Как сравнить count () со значением из другой таблицы?

    Два, где условия на одной колонке

    Что лучше для производительности, сделать неиспользуемые столбцы нулевыми или заполнить значениями

    Преобразование и группировка данных строки в столбцы

    Заказ столбцов в Microsoft SQL Server, когда они содержат теги html

    Давайте будем гением компьютера.