Обновление таблиц фактов в SQL не работает должным образом

Я работаю с SQL Server уже 4 месяца, и большая часть моей работы связана с созданием хранилища данных для моей компании. Обычно мы используем метод звездообразной схемы, но поскольку измерений слишком много, я обычно запускаю запросы UPDATE, чтобы позже заполнить столбцы измерений. При повторном тестировании моих запросов я столкнулся со странной ошибкой, которую абсолютно не могу объяснить и которая меня очень пугает. В моих данных был столбец Registered_on, типизированный как DateTime. Я создал измерение под названием HOUR с 24 строками, по одной на каждый час дня и целое число для сопоставления. Итак, первая строка — полночь и имеет столбец с 0.

Когда я запустил запрос

SELECT HourDimension.Hour
    ,DATEPART(Hour, AdmissionLogs.Registered_on)
FROM FactTable
INNER JOIN AdmissionLogs ON AdmissionLogs.ID = FactTable.LogID
INNER JOIN HourDimension ON HourDimension.HourNumber = DATEPART(Hour, AdmissionLogs.Registered_on)

Все совпало идеально, как на этом изображении.

введите здесь описание изображения

Поэтому я сделал запрос на обновление как:

UPDATE FactTable
SET FactTable.IdfHourDimension = HourDimension.IdfHourDimension
FROM FactTable
INNER JOIN AdmissionLogs ON AdmissionLogs.ID = FactTable.LogID
INNER JOIN HourDimension ON HourDimension.HourNumber = DATEPART(Hour, AdmissionLogs.Registered_on)

И после просмотра результатов таблицы фактов через:

SELECT HourDimension.Hour
    ,HourDimension.HourNumber
    ,DatePart(Hour, AdmissionLogs.Registered_on)
FROM FactTable
INNER JOIN HourDimension ON HourDimension.IdfHourDimension = FactTable.IdfHourDimension
INNER JOIN AdmissionLogs ON AdmissionLogs.ID = FactTable.LogID

Я получил это:

введите здесь описание изображения

Часы АБСОЛЮТНО не совпадают! Я не знаю, что происходит, но я серьезно сомневаюсь во всем, что знаю.


person Tamir Einhorn Salem    schedule 31.01.2020    source источник
comment
Примерные данные и ожидаемые результаты будут более полезными, отредактируйте и добавьте их к своему вопросу.   -  person Suraj Kumar    schedule 31.01.2020
comment
Только что сделал так. Мне ясно, что datepart работает над извлечением данных, поэтому он должен получать правильные записи из измерения часов, как это происходит в первом запросе.   -  person Tamir Einhorn Salem    schedule 31.01.2020
comment
Таблицы FactTable и AdmissionLogs… являются соответствием один к одному? В противном случае час и IdfHourDimension никогда не будут совпадать, поскольку существует несколько дат REGISTERED_ON, с которыми может соотноситься IdfHourDimension.   -  person JJ32    schedule 31.01.2020
comment
Они 1-1. Отношение между измерением и фактом — один ко многим.   -  person Tamir Einhorn Salem    schedule 01.02.2020
comment
Значит, количество записей в таблицах FactTable и AdmissionLogs одинаково? Хорошо. Что произойдет, если вы добавите столбец REGISTERED_ON в таблицу фактов, а также обновите его. Теоретически это должно совпадать, но мне интересно, даст ли это вам другое значение.   -  person JJ32    schedule 01.02.2020


Ответы (1)


person    schedule
comment
Я не понимаю. Почему я должен присоединять таблицу фактов к измерению, используя целое число, а не внешний ключ? Это проблема также из-за того, что число часов идет от 0 до 23, а Idf от 1 до 24, что приводит к несоответствию. - person Tamir Einhorn Salem; 01.02.2020
comment
Если вы предоставите синтаксис для создания небольшого образца исходных данных, я могу провести вас через него. Иногда бывает полезно провести параллельное сравнение значений, которые будут изменены, прежде чем вы зафиксируете оператор обновления. В вашем случае я подозреваю, что вы потеряли информацию о том, как изменилось значение FactTable.IdfHourDimension. - person Ulysses; 11.02.2020