Я работаю с HR-системой, построенной на .NET и Oracle, в которой мы храним:
- история трудоустройства в одной таблице с начальной / конечной датой, например, организация, процент работы, стоимость подразделения и т. Д.
- информация о зарплате в другой таблице с начальной / конечной датой, например, месячная зарплата, часовая зарплата
Каждый раз, когда в этой таблице изменяется какой-либо атрибут, мы создаем новую строку и устанавливаем конечную дату предыдущего периода.
Как правило, когда мы хотим представить пользователю «если», мы представляем только небольшой выбор атрибутов из обеих таблиц - например, организация и месячная зарплата, чтобы увидеть историческое развитие зарплаты сотрудников, и именно здесь она начинает будь жестким.
Если мы только присоединяемся к таблицам, мы получаем строку для каждого изменения, и если не было никаких изменений в зарплате организации / месяца, но в других атрибутах, пользователю был бы представлен ужасно запутанный список - «почему две строки »- очень актуальный вопрос для нашей поддержки. «Уважаемый пользователь - это потому, что мы храним данные в таблицах» - не очень хороший ответ;)
Data:
startdate stopdate organization jobpercent monthsalary
2011-01-01 2011-01-15 Sales 50 25000
2011-01-16 2011-06-01 Sales 100 25000
2011-06-02 Development 100 35000
Result when querying only for start/stop/organization monthsalary with no date merge
startdate stopdate organization monthsalary
2011-01-01 2011-01-15 Sales 25000
2011-01-16 2011-06-01 Sales 25000
2011-06-02 Development 35000
Проблема заключается в том, что мы должны объединить период, в котором выбранные атрибуты равны - можно изменить дату / дату, поскольку другие атрибуты, которые не выбраны, могут быть изменены.
This is the result I want when querying only for start/stop/organization monthsalary. The first two rows are merged into one
startdate stopdate organization monthsalary
2011-01-01 2011-06-01 Sales 25000
2011-06-02 Development 35000
Мы решили это, хотя и очень сложный SQL-оператор с низкой производительностью.
Есть ли кто-нибудь, кто решил подобный вариант использования? Или есть предложение о подходе?
Любая помощь высоко ценится!
С наилучшими пожеланиями
/ Anders