我正在尝试填充一个用于区分轮班的列。最理想的是,此列将填充文本值ShiftStartTimeDate_UnitCode_ShiftCount。我的班次规则是,如果单位发生变化,或者如果时间间隔超过6小时,则会开始新的班次。我正在使用非常大的表格,所以我不想遍历所有记录。 我想在下面的例子中推导出shift字段:
|str_time |unitcode|next_unitcode|time_diff|shift |
|________________|________|_____________|_________|_____________________|
|2015-08-26 10:52|A |A |1:00 |2015-08-26 10:52_A_1 |
|2015-08-26 11:52|A |A |1:00 |2015-08-26 10:52_A_1 |
|2015-08-26 18:52|A |A |7:00 |2015-08-26 18:52_A_2 |
|2015-08-26 19:52|A |B |1:00 |2015-08-26 18:52_A_2 |
|2015-08-26 06:52|B |B |-13:00 |2015-08-26 06:52_B_1 |
|2015-08-26 10:52|B |B |4:00 |2015-08-26 06:52_B_1 |
|2015-08-26 11:52|B |B |1:00 |2015-08-26 06:52_B_1 |
|2015-08-26 12:52|B |C |1:00 |2015-08-26 06:52_B_1 |
|2015-08-26 14:52|C |C |2:00 |2015-08-26 14:52_C_1 |
|2015-08-26 22:52|C |C |8:00 |2015-08-26 22:52_C_2 |
|2015-08-27 02:52|C |C |4:00 |2015-08-26 22:52_C_2 |
|2015-08-27 09:52|C |C |7:00 |2015-08-27 09:52_C_3 |
|2015-08-27 10:52|C |D |1:00 |2015-08-27 09:52_C_3 |
|2015-08-27 11:52|D |D |1:00 |2015-08-27 11:52_D_1 |
|2015-08-27 12:52|D |D |1:00 |2015-08-27 11:52_D_1 |
我觉得我越来越近了:
CREATE OR REPLACE FUNCTION calc_shift()
RETURNS void AS
$$
DECLARE
shiftInt integer;
BEGIN
UPDATE public.top10
SET shift = str_time || '_' || unitcode || '_' || shiftInt, shiftInt =: (CASE
WHEN
public.top10.unitcode <> public.top10.next_unitcode
THEN
0
ELSE
CASE
WHEN
public.top10.time_diff >= '06:00:00'
THEN
shiftInt
ELSE
shiftInt+1
END
END);
END;
$$
LANGUAGE 'plpgsql'
我的逻辑似乎有点奏效。但是,根据需要,我很难增加和调整shiftInt变量。知道我做错了什么吗?
由于