2012-01-11 50 views
2

我與HR系統的工作,使用.NET和Oracle建,我們在其中存儲:合併兩個時間段爲一個週期

  • 工作經歷與啓動/ stopdate一個表,例如組織,工作百分比,在開始/ stopdate另一個表costunit等
  • 工資信息,例如一個月的工資,小時工資

每當任何屬性此表改變了,我們創建一個新的行並設置上一期的停止日期。

通常,當我們想要向用戶展示時,我們只列出兩個表中的一小部分屬性 - 例如組織和月薪,以查看員工薪水的歷史發展情況,這是它開始的地方要堅強。

如果我們只聯接表,我們得到一排每一個變化,如果出現了組織/月的工資,但在其他屬性沒有改變,一個醜陋的混亂名單將提交給用戶 - 「爲什麼那裏有兩排「是我們支持的非常相關的問題。 「尊敬的用戶 - 這是因爲我們的數據存儲在對錶」是不是一個很好的答案;)

 
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語句解決了這個問題,但性能很差。

有沒有人有解決類似的用例?或者有一個方法的建議?

任何幫助是高度讚賞!

問候 /安德斯

回答

0

我服用點similiar我的HR應用程序,我做的是一個:

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

但也許只用獨特的薪水就足夠了。我必須說我即將談論的SQL服務器,我不知道甲骨文,但我想「獨特」也有。 ;-)

+0

日期(開始/停止日期)並不明顯,所以每次更改仍然會得到一行。所以問題是如何合併我的選定屬性沒有變化的時期。 – 2012-01-11 11:46:35

+0

獨特的是薪水領域沒有明星/停止日期。除了我得到的是每天工作數小時的行(即每個月有不同部門30行,我仍然返回一個月,例如x用戶在開發中工作了50小時,以及30銷售,新的即時通訊幾乎肯定你需要「分組」)。 – H27studio 2012-01-11 12:39:21

+0

棘手的部分是在select和group by上添加或刪除字段以獲取所需的行數。我花了幾個小時...... :-) – H27studio 2012-01-11 12:42:39

0

集團由organizationmonthsalary,因爲這些不會改變。然後,您可以通過取最小值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

美麗!您使用的假設完全適用!就業史上沒有差距。如果一個人重新就業 - 這個人得到另一個僱員!非常感謝你! – 2012-01-11 15:39:14