Создание периода даты из таблицы с месячными записями
Допустим, у нас есть таблица, которая выглядит так в 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, что-то вроде следующего:
- SQL Выберите все записи за последние два месяца
- SUM - список значений (содержать подзапрос)
- Запрос сервера Sql выполняет вставку дважды, а не один раз
- SSIS 2014 - назначение плоского файла с различным количеством столбцов
- Замените все символы строки на звездочки, кроме первых символов и пробела в MSSQL
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) для первого продукта. Я знаю, что должен быть какой-то способ сделать это, и я уверен, что это что-то простое, но я просто не могу думать об этом прямо сейчас. Я был бы очень признателен за любую помощь, которую вы могли бы мне дать, спасибо за чтение!
- Как определить текст unicode в sql?
- Как отправить DB Mail для двух динамических запросов и двух файлов в качестве прикрепления
- Как восстановить / скопировать данные из определенных таблиц в правильный порядок отношений в SQL Server?
- Как отсортировать столбец по длине данных в нем на SQL-сервере
- Открытие файла хранимой процедуры несколько раз в студии управления сервером sql
- Добавьте несколько ограничений в один оператор
- SQL: создание новой таблицы с результатами запроса
- Странная проблема в SSIS с WITH RESULTS SET, возвращающая неправильное количество столбцов
Вы можете использовать следующий запрос:
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
.