Я использовал здесь технику хранения данных, поэтому имена таблиц dim
и fact
.
![alt text](https://i.stack.imgur.com/bEQUd.png)
dimDate называется такизмерение даты, одна строка на дату.
dimCandidate содержит все данные кандидата, новые и старые записи.В терминах хранилища данных это называется измерением типа 2.Один кандидат может иметь несколько строк в этой таблице, только одна из них имеет r_status
= 'current'.
Поля
, r_valid_from date
, r_valid_to date
, r_version integer -- (1, 2, 3,..)
, r_status varchar(10) -- (expired, current)
описывают статус записи (строки).Каждый раз, когда изменяется статус кандидата, вставляется новая строка и изменяются r_valid_to
и r_status
предыдущей строки.
CandidateFullName
является бизнес-ключом (натуральным) и должен однозначно идентифицировать кандидата.Ни один из двух кандидатов не может иметь одинаковые CandidateFullName
.Обратите внимание, что CandidateKey
уникально идентифицирует строку в таблице, а CandidateFullName
уникально идентифицирует кандидата.
dimVoter содержит данные об избирателях, новые и старые записи - точно так же, как dimCandidate .
dimCampaign описывает детали кампании, это так называемое измерение типа один, не содержит исторических данных.
factRating имеет показатель Rating.
Обычно этого будет достаточно, но естьтребование интерполировать недостающие данные за день;для этого вводится сводная таблица aggDailyRating .В конце дня запланированное задание собирает рейтинги за день.Эта работа заботится о требованиях интерполяции данных.Таким образом, таблица агрегирования имеет одну строку для каждой комбинации date-(valid) candidate-campaign
.Обратите внимание, что избиратель не включен в комбинацию, данные агрегированы по всем избирателям.
![alt text](https://i.stack.imgur.com/lqzSi.png)
Любые отчеты составляются в сводной таблице, например
--
-- monthy rating for years 2009-2010
-- for candidate john_smith_256
--
select
CalendarYear
, MonthNumber
, avg(DailyRating) as AverageRating
from aggDailyRating as f
join dimDate as d on d.DateKey = f.DateKey
join dimCandidate as c on c.CandidateKey = f.CandidateKey
where CandidateFullName = 'john_smith_256'
and CalendarYear between 2009 and 2010
group by CalendarYear, MonthNumber
order by CalendarYear desc, MonthNumber desc ;