Объединить два периода времени в один период - PullRequest
2 голосов
/ 11 января 2012

Я работаю с 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

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Группируйте по organization и monthsalary, так как они не меняются.Затем вы можете объединить периоды, взяв минимум startdate и максимум stopdate.Это при условии, что между периодами нет пробелов:

with USRDAT as
       (select to_date('01/Jan/2011') as STARTDATE, to_date('15/Jan/2011') as STOPDATE, 'Sales' as ORGANIZATION, 25000 as MONTHSALARY from dual
        union all
        select to_date('16/Jan/2011'), to_date('01/Jun/2011'), 'Sales', 25000 from dual
        union all
        select to_date('02/Jun/2011'), null, 'Development', 35000 from dual)
  select min(STARTDATE) as STARTDATE, max(STOPDATE) as STOPDATE, ORGANIZATION, MONTHSALARY
    from USRDAT
group by ORGANIZATION, MONTHSALARY
0 голосов
/ 11 января 2012

Я делаю что-то похожее на мое приложение по работе с персоналом, вот что я делаю:

select distinct salary, xxx fields and then group by for all the fields

Но, может быть, только с отличной зарплатой будет достаточно. Я должен сказать, что я говорю о сервере SQL, я не знаю об Oracle, но я думаю, что есть и "отличный". ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...