1

我有带有许多记录表的 oracle 10g 数据库。表中包含接收某种订单的员工的数据。大多数可用的列是employee、dt 和orderId(我附上了示例)。我想构建选择,它将选择在任何4 小时内有 6 个或更多订单的员工的记录。我使用了常规连接,各种功能,但我仍然没有做出可用的选择。我无法为过去(4 小时)的每个记录搜索选择该选项,并查看同一员工是否有 6 个订单。

任何帮助或解决方案表示赞赏。

BR,

IJ

http://sqlfiddle.com/#!2/77418/1

选择的输出应该是:

乔 19.2.2013 13:28:09 36589589

乔 19.2.2013 13:50:59 36589593

马特 19.2.2013 13:57:02 36589594

乔 19.2.2013 14:19:46 36589598

本尼 19.2.2013 14:50:28 36589601

本尼 19.2.2013 14:54:58 36589602

班尼 19.2.2013 14:56:35 36589603

雷 19.2.2013 15:26:39 36589607

雷 19.2.2013 15:26:41 36589608

雷 19.2.2013 15:26:44 36589609

雷 19.2.2013 15:48:11 36589611

本尼 19.2.2013 16:48:52 36589614

班尼 19.2.2013 16:49:40 36589615

本尼 19.2.2013 16:50:38 36589616

约翰尼 19.2.2013 17:37:33 36589620

约翰尼 19.2.2013 17:51:41 36589621

乔 19.2.2013 18:16:55 36589625

约翰尼 19.2.2013 18:34:14 36589626

马特 19.2.2013 21:13:50 36589632

4

2 回答 2

3

您可以使用以下lag()功能执行此操作:

select t.*, 
from (select t.*, lag(dt, 6) over (partition by employeeId order by dt) as ord6dt
      from t
     ) t
where dt - ord6dt < 4.0/24

这只是查看当前订单之前的第 6 个订单并比较日期。仅保留时间差小于 4 小时的行。

于 2013-02-20T14:36:46.503 回答
0

像这样的事情应该这样做:

select distinct employee
  from (select employee, dt, orderid,
               (select count(*)
                    from emp_data ed2
                   where ed2.employee = ed.employee
                     and ed2.dt >= ed.dt
                     and ed2.dt <= ed.dt + (4/24)) cnt
            from emp_data ed)
 where cnt >= 6;

或者如果您不想从 09:00:00 - 13:00:00 计算,但只能计算到 12:59:59,请替换为and ed2.dt <= ed.dt + (4/24)and ed2.dt < ed.dt + (4/24)

于 2013-02-20T14:01:48.387 回答