【问题标题】:Oracle SQL: Counting in 4h?Oracle SQL:计算 4 小时?
【发布时间】:2013-02-20 13:42:50
【问题描述】:

我有一个包含许多记录的表的 oracle 10g 数据库。 表中包含接收某种订单的员工的数据。 大多数可用的列是employee、dt 和orderId(我附上了示例)。 我想构建 select 来选择在 any 4h 中有 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 小时”是什么意思?我猜不是最近 4 小时,但如果您提供示例数据会更好。
  • 我已经准备好图片但无法上传。
  • @ypercube:我怀疑 OP 想回答“哪些员工在 2003-02-18 08:00 和 2003-02-18 12:00 之间至少有 6 个订单, 在 2003-02-18 08:01 和 2003-02-18 12:01 之间, 在 2003-02-18 08:02 和 2003-02-18 12:02 之间, ...”
  • 我的声望为 8,需要 10 才能上传图片,抱歉,等我达到 10 我会上传示例。
  • 是的,如果乔在 2013 年 2 月 18 日 9:02 收到了订单,我想检查他从 18.2.2013 5:02 到 18.2.2013 9:02 是否有 5 个或更多订单,包括这个在 9 点 02 分,即 6 点或更多。对不起,在例子中很清楚。

标签: sql function stored-procedures oracle10g


【解决方案1】:

您可以使用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 小时的行。

【讨论】:

  • :是否有可能用滞后函数对字段求和?例如:如果每行附近有另一个带有数值的列,例如5$,我想说列出所有在 4h 内并且 sum(order_amount)>10$?
【解决方案2】:

应该这样做:

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 &lt;= ed.dt + (4/24) 替换为 and ed2.dt &lt; ed.dt + (4/24)

【讨论】:

  • 我认为如果用户不发布结构、数据样本和所需的输出,我们应该停止提供帮助......
  • @Art:我同意,但由于声誉问题我无法添加图片,所以现在我已经在 Fiddle 上创建了表格并插入了行,希望它有助于描述我的问题
  • @Johnny - 我想你已经从两个最好的人那里得到了答案......发布代码时使用 ctrl+K。
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多