#php #date #data-warehouse
#php #Дата #хранилище данных
Вопрос:
Я внедряю базовую звездообразную схему для предоставления отчетов о закупках для моей компании. Наши таблицы фактов суммируются по 4 измерениям и агрегируются с ежедневными, еженедельными, ежемесячными и годовыми итогами.
В настоящее время код знает, как обрабатывать отчеты за отдельные дни, недели, месяцы и годы. Следующим шагом является реализация отчетов о произвольном диапазоне дат. При наличии диапазона цель состоит в том, чтобы определить общее количество лет, месяцев, недель и дней между двумя датами и извлечь соответствующие записи для вычисления общего количества. Проблема в том, что нам нужно определить количество каждого полного периода детализации между двумя датами, а не только количество прошедшего времени.
Например, между ‘2009-06-29’ и ‘2011-06-29’ прошло 2 года, однако нам нужно знать, что этот диапазон состоит из одного полного года (2010), одиннадцати месяцев (январь-май / 10 и июль-декабрь / 09) и 58 дней (1-29 / 09 июня и 1-29 / 11 июня).
Из этого результата мы можем извлечь уже обобщенные записи из 70 детализированных периодов, объединить и представить итоговое значение.
Я писал тестовый код, чтобы определить наилучший способ разбиения диапазона дат на составные части, однако я отступаю, поскольку подозреваю, что переосмысливаю этот процесс. Текущий проект работает следующим образом:
- Заполните массив «datesToParse» начальным диапазоном дат.
- Определите, существует ли один или несколько полных лет между датами.
- Для каждого года между датами удаляйте этот период из диапазона дат и разделяйте «период до» и «период после» года на два новых диапазона дат.
- Поместите два новых диапазона дат в стек «datesToParse».
- Повторять
- Когда все возможные годы будут удалены из массива «datesToParse», повторите процесс для месяцев, недель и дней.
Теоретически это должно рекурсивно сократить начальный диапазон дат до набора полных лет, месяцев, недель и дней.
Есть ли лучший способ сделать это? Похоже, что эта проблема решалась много раз раньше.
Комментарии:
1. Разве вы не можете просто выбрать все агрегированные ежедневные итоги за этот период и просуммировать их в SQL?
Ответ №1:
Я не понимаю, почему вы хотите реализовать такое сложное решение, обычная реализация заключается в том, чтобы иметь только одну таблицу фактов с данными на самом низком уровне детализации (ежедневно в вашем случае) и просто СУММИРОВАТЬ () показатели в ваших запросах по мере необходимости.
Это очень просто реализовать и поддерживать, а запросы очень легко писать (или генерировать из вашего инструмента создания отчетов). У вас это не работает? Какой объем данных у вас есть? Реализовали ли вы дату как измерение (надеюсь, да) или как значение в таблице фактов? Используете ли вы инструмент создания отчетов (SSRS, Cognos, Business Objects) или создаете свои собственные запросы?
Если вы думаете о проблемах с производительностью, то для DWH довольно часто происходит подобное развитие:
- Реализовать единую таблицу фактов (как описано выше)
- Добавьте много данных
- Обнаруживайте проблемы с производительностью по мере увеличения объема данных
- Улучшение индексации
- Реализовать разбиение таблицы на разделы
- Реализовать OLAP
Ваше решение звучит несколько как самодельная реализация OLAP, но непонятно, зачем вам это нужно. Если ваш объем данных невелик или средний, вы, вероятно, сможете очень хорошо управлять им с помощью индексации и секционирования. Если они большие, то вы, вероятно, в любом случае собираетесь использовать OLAP и специализированные инструменты отчетности, что было бы гораздо более широкой проблемой. Но вы не предоставили много информации о своей среде или требованиях, поэтому я, возможно, здесь не совсем точен.