2014-12-30 44 views
3

我需要使用不同的分組(人員,事件類型等)計算每個工作小時的事件。每小時postgresql事件

這是我的問題的簡化模式。

create table person (
    id  integer PRIMARY KEY, 
    name  text 
); 

create table occupation (
    id  integer PRIMARY KEY, 
    name  text, 
    start_date date, 
    end_date date, 
    person_id  integer 
); 

create table work_shift (
    shift  integer PRIMARY KEY, 
    start_date date, 
    end_date date, 
    hours  integer, 
    occupation_id integer 
); 

create table event ( 
    id  integer PRIMARY KEY, 
    type  text, 
    event_date date, 
    person_id  integer 
); 

的樣本數據:

insert into person values (1, 'first person'); 
insert into person values (2, 'second person'); 

insert into occupation values (1, 'MUSICIAN', to_date('2014-01-01', 'YYYY-MM-DD'), to_date('2014-12-31', 'YYYY-MM-DD'), 1); 
insert into occupation values (2, 'MUSICIAN', to_date('2014-01-01', 'YYYY-MM-DD'), to_date('2014-12-31', 'YYYY-MM-DD'), 2); 


delete from work_shift; 
insert into work_shift values (1, to_date('2014-01-01', 'YYYY-MM-DD'), to_date('2014-01-01', 'YYYY-MM-DD'), 7, 1); 
insert into work_shift values (2, to_date('2014-01-02', 'YYYY-MM-DD'), to_date('2014-01-02', 'YYYY-MM-DD'), 8, 1); 
insert into work_shift values (3, to_date('2014-01-01', 'YYYY-MM-DD'), to_date('2014-01-01', 'YYYY-MM-DD'), 8, 2); 
insert into work_shift values (4, to_date('2014-01-02', 'YYYY-MM-DD'), to_date('2014-01-02', 'YYYY-MM-DD'), 7, 2); 

-- person 1, playing, day 1 
insert into event values (1, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 
insert into event values (2, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 
insert into event values (3, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 
insert into event values (4, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 
insert into event values (5, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 

-- person 1, singing, day 1 
insert into event values (6, 'SINGING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 
insert into event values (7, 'SINGING', to_date('2014-01-01', 'YYYY-MM-DD'), 1); 

-- person 1, playing, day 2 
insert into event values (8, 'PLAYING', to_date('2014-01-02', 'YYYY-MM-DD'), 1); 
insert into event values (9, 'PLAYING', to_date('2014-01-02', 'YYYY-MM-DD'), 1); 
insert into event values (10, 'PLAYING', to_date('2014-01-02', 'YYYY-MM-DD'), 1); 
insert into event values (11, 'PLAYING', to_date('2014-01-02', 'YYYY-MM-DD'), 1); 

-- person 2, playing, day 1 
insert into event values (12, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 
insert into event values (13, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 
insert into event values (14, 'PLAYING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 

-- person 2, singing, day 1 
insert into event values (15, 'SINGING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 
insert into event values (16, 'SINGING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 
insert into event values (17, 'SINGING', to_date('2014-01-01', 'YYYY-MM-DD'), 2); 

-- person 2, singing, day 2 
insert into event values (18, 'SINGING', to_date('2014-01-02', 'YYYY-MM-DD'), 2); 
insert into event values (19, 'SINGING', to_date('2014-01-02', 'YYYY-MM-DD'), 2); 
insert into event values (20, 'SINGING', to_date('2014-01-02', 'YYYY-MM-DD'), 2); 

我將如何計算每天每個小時例如事件?我遇到的問題是我的計算結果多次相同的工作班次。所以我用id 1計算了多次工作班次。當職業和月分組將

occupation day ratio 
MUSICIAN  1  0,93 ((3+2+2+2+5)/(7+8)) 
MUSICIAN  1  0,73 ((4+7)/(7+8)) 

其他的例子,我需要計算

通緝的結果是每人每天小時。

我的基本查詢目前處於

SELECT 
    month, 
    some-group-by-term, 
    some-aggregate-function 
FROM table 
GROUP BY group-by-term 

形式是否有可能創建計算這些事件/小時(某些項分組)與此類似疑問?

+0

你的數據庫設計較差。你應該先處理。 +1提供數據和所需的輸出。 –

+0

感謝您的評論。爲了在我真實的數據庫中闡明我有事件表,它引用了人。我也在附屬人員的單獨桌子上安排工作班次。顯示的表格結構只是爲了展示問題區域。 – eerok

+0

將1xn關係加入1xm關係會導致nxm關係,這可能是您正面臨的問題。您需要顯示簡化但兼容的模式,以便可以指出解決方案。您可能需要預先彙總引用表。 –

回答

2

我加倍分組應該在這些情況下工作:

select occupation, day, sum(events)*1.0/sum(hours) ratio from 
(select occupation,day,work_shift_id, sum(events) events 
from person_work 
group by occupation, day, work_shift_id) a 
join 
person_work_shift b on a.work_shift_id=b.shift_id 
group by occupation, day 
+0

這似乎給出了示例數據的正確結果。如果我仍然發現一些古怪的話,我需要檢查我的真實數據。 – eerok

+0

這解決了我的計算問題。儘管我不得不爲它製造一些令人討厭的原生查詢。 – eerok