Обновление таблиц фактов в SQL не работает должным образом - PullRequest
3 голосов
/ 31 января 2020

Я работаю с SQL Server уже 4 месяца, и большая часть моей работы заключается в создании Datawarehouse для моей компании. Обычно мы используем метод звездообразной схемы, но поскольку измерений слишком много, я обычно запускаю запросы UPDATE, чтобы заполнить столбцы измерений позже. После повторного тестирования моих запросов я натолкнулся на причудливую ошибку, которую абсолютно не могу объяснить, и это меня очень пугает. В моих данных был столбец Registered_on с типом DateTime. Я создал измерение под названием HOUR с 24 строками, по одному на каждый час дня и int для соответствия. Итак, первая строка полночь и содержит столбец с 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)

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

enter image description here

Таким образом, я выполнил запрос на обновление как:

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

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

enter image description here

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

1 Ответ

1 голос
/ 31 января 2020
The results are different because you are not asking the same SELECT.

In the original query in which "Everything Matches Perfectly" you have ...
INNER JOIN HourDimension
 ON HourDimension.HourNumber = DATEPART(Hour, AdmissionLogs.Registered_on)

In the later query, after the UPDATE you have ...
INNER JOIN HourDimension
 ON HourDimension.IdfHourDimension = FactTable.IdfHourDimension


It should read...
SELECT HourDimension.Hour
    ,HourDimension.HourNumber
    ,DatePart(Hour, AdmissionLogs.Registered_on)
FROM FactTable
INNER JOIN AdmissionLogs
 ON AdmissionLogs.ID = FactTable.LogID
INNER JOIN HourDimension
 ON HourDimension.HourNumber = FactTable.IdfHourDimension
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...