Таблица, над которой я работаю, состоит из трех компонентов:
ID
Столбец (первичный ключ в другой таблице)- Некоторые столбцы данных
- Дата действительна
from
/to
столбцы.
Ценности:
ID Data From To
1 a 2015-01-01 2015-01-05
1 a 2015-01-06 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-05
2 c 2015-01-06 2015-01-10
Таблица обновляется путем создания «снимков» другого источника данных через определенные промежутки времени и назначения дат действия для записей. Проблема заключается в том, что эти снимки создают повторяющиеся записи для записей (с разными датами действия), которые не изменились вообще в течение этого интервала.
Я хочу уменьшить размер таблицы, ища строки с последовательными датами, объединяя их и назначая им один период действия. Например:
ID Data From To
1 a 2015-01-01 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-10
Логика у меня в настоящее время есть:
- Выделите и отсортируйте все строки по идентификатору, полям данных и полям 'valid from' (чтобы они были в группах последовательных строк).
- Используйте курсор для сравнения соседних строк на предмет сходства.
- Если они одинаковы, объедините строки и измените срок действия, чтобы включить обе строки.
Я понимаю, что курсоры очень неэффективны (у меня большой набор данных), поэтому я ищу другие подходы.
CREATE TABLE
утверждение в вопрос.Ответы:
Если это таблица только между рядами, ваш случай может рассматриваться как классическая проблема «разрывов и островков», когда вам просто нужно изолировать островки последовательных диапазонов, а затем «сжать» их, взяв минимум
[from]
и максимум[to]
на остров.Существует установленный метод решения этой проблемы с использованием двух вызовов ROW_NUMBER:
Этот запрос будет работать в более низкой версии, чем SQL Server 2005.
источник
Мне удалось написать запрос для решения этой проблемы. Он использует несколько объединений и цикл while для объединения записей. Этот код совместим с SQL Server 2008 R2.
источник
Просто для случая, когда у вас есть несмежные диапазоны дат, которые, хотя и должны быть последовательными, должны оставаться отдельными, я предложил следующее решение:
Смотри на SQL Fiddle
источник
Я написал запрос, который, кажется, работает. Он использует общие табличные выражения, операторы MERGE и аналитические функции. Однако он совместим только с SQL Server 2012+. Вы можете найти суть здесь: MergeRecordsByValidityDate.sql
источник