Я пытаюсь очистить не столь полезную таблицу истории, изменив ее формат. Для использования таблицы истории важно, какое время была действительной строка.Перенос таблицы истории точек SQL Server в таблицу истории периодов
Текущая ситуация:
Unit | Value | HistoryOn |
----------------------------------------
1 | 123 | 2013-01-05 14:16:00
1 | 234 | 2013-01-07 12:12:00
2 | 325 | 2013-01-04 14:12:00
1 | 657 | 2013-02-04 17:11:00
3 | 132 | 2013-04-02 13:00:00
Проблема, которая возникает в том, что, как эта таблица растет она будет становиться все более ресурсов голодны, когда я хочу знать, в каком состоянии все мои контейнеры были в течение определенного периода времени. (Скажем, я хочу знать значение для всех единиц на определенную дату)
мое решение создать таблицу в формат:
Unit | value | HistoryStart | HistoryEnd |
---------------------------------------------------------------------
1 | 123 | 2013-01-05 14:16:00 | 2013-01-07 12:11:59
1 | 234 | 2013-01-07 12:12:00 | 2013-02-04 17:10:59
1 | 657 | 2013-02-04 17:11:00 | NULL
2 | 325 | 2013-01-04 14:12:00 | NULL
3 | 132 | 2013-04-02 13:00:00 | NULL
Обратите внимание, что значение NULL в HistoryEnd здесь указывает, что строка все еще отражает текущий статус.
Я пробовал, чтобы использовать левое соединение на самом столе, используя поле HistoryOn. Это привело к неудачному побочному эффекту каскадирования нежелательным образом.
SQL Query используется:
SELECT *
FROM webhistory.Units u1 LEFT JOIN webhistory.Units u2 on u1.Unit = u2.Unit
AND u1.HistoryOn < u2.HistoryOn
WHERE u1.Units = 1
Результат запроса выглядит следующим образом:
Unit | Value | HistoryOn | Unit | Value | HistoryOn |
-------------------------------------------------------------------------------------
1 | 657 | 2013-02-04 17:11:00 | NULL | NULL | NULL
1 | 234 | 2013-01-07 12:12:00 | 1 | 657 | 2013-02-04 17:11:00
1 | 123 | 2013-01-05 14:16:00 | 1 | 657 | 2013-02-04 17:11:00
1 | 123 | 2013-01-05 14:16:00 | 1 | 234 | 2013-01-07 12:12:00
Этот эффект инкрементный, поскольку каждая запись будет присоединяться по всем записям, которые являются более новыми, чем он сам, вместо только первая запись, которая приходит после него.
К сожалению, пока я не могу найти хороший запрос для решения этой проблемы и хотел бы получить информацию или предложения, которые могли бы помочь мне решить эту проблему миграции.
Спасибо за ответ, в то время как я не использовал это в качестве своего окончательного решения, он заставил меня посмотреть, где я ошибся. Вместо того, чтобы использовать OUTER APPLY, я предположил, что я использовал вложенный выбор: 'select *, (выберите top 1 historyon из #webhist u2, где u2.historyon> u1.historyon и u1.unit = u2.unit) от #webhist u1; ' – MSB
Еще проще :) Рад помочь. –